Android: как использовать CursorAdapter?

У меня есть база данных, ListView и CustomCursorAdapter , который расширяет CursorAdapter . Кнопка меню добавляет элемент в базу данных. Я хочу, чтобы ListView обновил и показал это изменение. Обычно он не показывает этот новый элемент, пока я не перехожу на домашний экран и снова не открываю приложение. Почему он обновляется правильно, когда для autoRequery задано значение false?

Правильно ли я использую CursorAdapter ? Каков стандартный способ обновления списка с базой данных? И что делает autoRequery?

16
задан Luksprog 19 November 2011 в 15:51
поделиться

1 ответ

Идиоматический и имхо правильный способ автоматического обновления Cursor s заключается в вызове Cursor # setNotificationUri при их создании и перед их передачей в все, что их просило. Затем вызовите ContentResolver # notifyChange , когда что-либо в пространстве имен Uri этого Cursor изменится.

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

content://org.example/all_mail
content://org.example/labels
content://org.example/messages

Теперь, допустим, я хотел получить курсор, который давал мне всю почту и обновлялся при поступлении новой почты:

Cursor c;
//code to get data
c.setNotificationUri(getContentResolver(), Uri.parse("content://org.example/all_mail");

Теперь приходит новая почта, поэтому я уведомляю:

//Do stuff to store in database
getContentResolver().notifyChange(Uri.parse("content://org.example/all_mail", null);

Я также должен уведомить все Курсор , которые выбраны для меток, это новое сообщение встретилось

for(String label : message.getLabels() {
  getContentResolver().notifyChange(Uri.parse("content://org.example/lables/" + label, null);
}

А также, возможно, курсор просматривает это одно конкретное сообщение, поэтому также уведомите их:

getContentResolver().notifyChange(Uri.parse("content://org.example/messages/" + message.getMessageId(), null);

Вызовы getContentResolver () происходят там, где данные доступен. Итак, если он находится в Службе или ContentProvider , именно здесь вы устанавливаетеNotificationUri и notifyChange . Вы не должны делать это из того места, где осуществляется доступ к данным, например, Activity .

AlarmProvider - это простой ContentProvider , который использует этот метод для обновления Cursor s.

37
ответ дан 30 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: