Контент-провайдер обновляет все строки - PullRequest
2 голосов
/ 30 марта 2012

работает на контент-провайдере, и у меня возникла проблема с ним.Когда я пытаюсь обновить определенную строку в базе данных SQLite через поставщика контента, он обновляет столбец во всех строках, а не только в указанной мной строке.Я знаю, что CP работает, потому что я могу получить к нему доступ, заполнить его списком и изменить содержимое столбца, но не один столбец.

Вот соответствующий метод обновления

public int update(Uri url, ContentValues values, String where,
            String[] whereArgs) {
        SQLiteDatabase mDB = dbHelper.getWritableDatabase();
        int count;
        String segment = "";
        switch (URL_MATCHER.match(url)) {
        case ITEM:
            count = mDB.update(TABLE_NAME, values, where, whereArgs);
            break;
        case ITEM__ID:
            segment = url.getPathSegments().get(1);
            count = mDB.update(TABLE_NAME, values,
                    "_id="
                            + segment
                            + (!TextUtils.isEmpty(where) ? " AND (" + where
                                    + ')' : ""), whereArgs);
            break;

        default:
            throw new IllegalArgumentException("Unknown URL " + url);
        }
        getContext().getContentResolver().notifyChange(url, null);
        return count;
    }

и вот код, который я использую (чтобы попытаться) обновить его.

ContentValues mUpdateValues = new ContentValues();

mUpdateValues.put(ContentProvider.HAS, "true");
mUpdateValues.put(ContentProvider.WANT, "false");

mRowsUpdated = getContentResolver().update(Uri.parse(ContentProvider._ID_FIELD_CONTENT_URI
+ rowId), mUpdateValues, null, null);

, а вот URI

URL_MATCHER.addURI(AUTHORITY, TABLE_NAME + "/#", ITEM__ID);

Спасибо, любая помощь будет оценена.

РЕДАКТИРОВАТЬ Я также пытался

mRowsUpdated = getContentResolver().update(
                    ContentProvider._ID_FIELD_CONTENT_URI, mUpdateValues,
                    null, null);

и

mRowsUpdated = getContentResolver().update(
                    ContentProvider.CONTENT_URI, mUpdateValues,
                    null, null);

1 Ответ

2 голосов
/ 30 марта 2012

Вы не указываете предложение WHERE, которое используется для обновления только определенных строк. Поведение поставщиков содержимого по умолчанию - обновлять все строки, если не указаны условия.

Из документов: developer.android.com/reference/android/content/ContentResolver.html

Parameters
uri     The URI to modify.
values  The new field values. The key is the column name for the field. A null value will remove an existing field value.
where   A filter to apply to rows before updating, formatted as an SQL WHERE clause (excluding the WHERE itself).
...