SQLite “database schema has changed” error in Cont

2019-08-02 06:37发布

I'm using Content Providers and Sync Adapters for my synchronization routine.

My routine receives a JSONObject and insert or update the entry.

In order to decide if we are going to update or insert we check if the entry exists in the database. This is where the sqlite error occurs.

06-03 10:58:21.239: INFO/Database(340): sqlite returned: error code = 17, msg = prepared statement aborts at 45: [SELECT * FROM table WHERE (id = ?) ORDER BY id]

I have done some research and found this discussion about the subject. From this discussion I understand that sqlite_exec() has to be called. How would I implement this in a Content Provider?

Edit

Insert / Update check

// Update or Insert
ContentValues cv = new ContentValues();
/* put info from json into cv */
if(mContentResolver.update(ClientsProvider.CONTENT_URI, cv, null, null) == 0) {
    // add remote id of entry
    cv.put("rid", o.optInt("id"));
    mContentResolver.insert(ClientsProvider.CONTENT_URI, cv);
}

ContentProvider::update

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    int count = 0;
    switch(uriMatcher.match(uri)) {
    case CLIENTS:
        count = clientDB.update(TABLE_NAME, values, selection, selectionArgs);
        break;
    case CLIENT_ID:
        count = clientDB.update(TABLE_NAME, values, ID + " = " + uri.getPathSegments().get(0) + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
        break;
    default:
        count = 0;
    }
    return count;
}

1条回答
倾城 Initia
2楼-- · 2019-08-02 06:49

Problem is solved. I'm not sure why but after an emulator image wipe everything works exactly how its supposed to do. Thank you for your time Selvin!

查看更多
登录 后发表回答