Подтвердить что ты не робот

Вызов метода удаления в пользовательском контенте

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

Вот код для настраиваемого поставщика контента (EarthquakeProvider.java):

@Override


public int delete(Uri uri, String where, String[] whereArgs) {
int count;

switch (uriMatcher.match(uri)) {
  case QUAKES:
    count = earthquakeDB.delete(EARTHQUAKE_TABLE, where, whereArgs);
    break;

  case QUAKE_ID:
    String segment = uri.getPathSegments().get(1);
    count = earthquakeDB.delete(EARTHQUAKE_TABLE, KEY_ID + "="
                                + segment
                                + (!TextUtils.isEmpty(where) ? " AND (" 
                                + where + ')' : ""), whereArgs);
    break;

  default: throw new IllegalArgumentException("Unsupported URI: " + uri);
}

getContext().getContentResolver().notifyChange(uri, null);
return count;


 }

Я пытаюсь вызвать метод delete из основного действия для удаления одной записи, а не всей базы данных. Я хочу использовать для OnLongClickListener для выбранной записи, которая отображается в виде списка массивов в основном действии.

Это то, что я придумал, до сих пор в своей основной деятельности для этого метода:

earthquakeListView.setOnItemLongClickListener(new OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView _av, View _v, int _index,
            long arg3) {
        ContentResolver cr = getContentResolver();
        cr.delete(earthquakeProvider.CONTENT_URI, null, null); 

        return false;
    }

Я знаю, что приведенный выше код не работает, но это как можно ближе к моему текущему пониманию.

Любая помощь по этому поводу будет очень оценена.

4b9b3361

Ответ 1

cr.delete(earthquakeProvider.CONTENT_URI, null, null);

Это твоя проблема. Во-первых, некоторый контекст:

Содержимое URI: (источник)

content://authority/path/##

Число в конце является необязательным. Если присутствует, URI ссылается на определенную строку в базе данных, где row._id = (число). Если отсутствует, он ссылается на таблицу в целом.

вызов delete() принимает URI, предложение where и набор строк, которые заменяются. Пример: предположим, что у вас есть база данных людей.

cr.delete(
   Person.CONTENT_URI, 
   "sex=? AND eyecolor=?", 
   new String[]{"male", "blue"});

Будет искать всю таблицу людей и удалять кого-либо, чей секс является мужчиной и цвет глаз которого синий.

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

Существует два способа указать нужную строку:

Первый вариант, вы можете добавить номер в URI:

cr.delete(
    EarthquakeProvider.CONTENT_URI.buildUpon().appendPath(String.valueOf(_id)).build(),
    null, null);

Это ограничивает URI определенной строкой, и путь будет через ваш оператор case QUAKE_ID: и поэтому будет удалять только одну строку независимо от того, что.

Второй вариант, вы можете использовать предложение where:

cr.delete(EarthquakeProvider.CONTENT_URI, "_id=?", String.valueOf(_id)));

В любом случае, вы будете ограничивать удаление одной строкой, как вам нужно. Последний делает более красивый код, но первый более эффективен из-за того, как работают ContentProvider и ContentObservers.

Как последнее примечание: в вашем ContentProvider вам нужно добавить вызов ContentResolver.notifyChange(Uri uri, наблюдатель ContentObserver, логическая syncToNetwork). Это помогает уведомлять курсоры о повторной выборке запроса базы данных и помогает в автоматизации с автоматизацией.