cr.delete(earthquakeProvider.CONTENT_URI, null, null);
Это ваша проблема.Во-первых, некоторый контекст:
URI содержимого: ( source )
content://authority/path/##
Число в конце необязательно.Если присутствует, URI ссылается на конкретную строку в базе данных, где row._id = (число).Если отсутствует, он ссылается на таблицу в целом.
вызов delete () принимает URI, предложение where и набор строк, которые подставляются. Пример: скажем, у вас есть база данных людей.
cr.delete(
Person.CONTENT_URI,
"sex=? AND eyecolor=?",
new String[]{"male", "blue"});
Произведет поиск по всей таблице персонажа и удалит любого, чей пол мужской и цвет глаз синий.
Если предложение where и значения null равны, тогда 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 (UriURI, обозреватель ContentObserver, логическая сеть SyncToNetwork).Это помогает уведомлять курсоры о повторном получении запроса к базе данных и очень помогает с автоматизацией.