Ошибка SQLite «схема базы данных изменилась» в Content Provider - PullRequest
1 голос
/ 03 июня 2011

Я использую Content Providers и Sync Adapters для своей подпрограммы синхронизации.

Моя подпрограмма получает JSONObject и вставляет или обновляет запись.

Чтобы решить,мы собираемся обновить или вставить, мы проверяем, существует ли запись в базе данных.Вот где возникает ошибка sqlite.

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]

Я провел некоторое исследование и обнаружил это обсуждение этого вопроса.Из этого обсуждения я понимаю, что sqlite_exec() должен быть вызван.Как мне реализовать это в контент-провайдере?

Редактировать

Проверка вставки / обновления

// 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 Ответ

1 голос
/ 03 июня 2011

Проблема решена. Я не уверен почему, но после стирания образа с эмулятора все работает именно так, как должно. Спасибо за ваше время Селвин!

...