Вызов метода удаления в поставщике нестандартного контента - PullRequest
12 голосов
/ 11 марта 2011

Я изучаю 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;


 }

Я пытаюсь вызвать метод удаления из основного действия, чтобы удалить одну запись, а не всю базу данных. Я хочу использовать около 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;
    }

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

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...