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