Ответ 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). Это помогает уведомлять курсоры о повторной выборке запроса базы данных и помогает в автоматизации с автоматизацией.