Ответ 1
Идиоматический и imho правильный способ автоматического обновления Cursor
заключается в вызове Cursor#setNotificationUri
, когда они созданы, и до их передачи к тому, что их просило. Затем вызовите ContentResolver#notifyChange
, когда что-нибудь в этом пространстве имен Cursor
Uri изменится.
Например, предположим, что вы создавали простое почтовое приложение, и вы хотели обновить его при поступлении новой почты, а также предоставить различные мнения по почте. Я бы определил некоторые основные 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);
Я также должен уведомить все Cursor
, которые выбраны для ярлыков, это новое сообщение встретило
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()
происходят там, где доступны данные. Поэтому, если он находится в Service
или ContentProvider
, где вы setNotificationUri
и notifyChange
. Вы не должны делать этого, откуда доступны данные, например, Activity
.
AlarmProvider
- это простой ContentProvider
, который использует этот метод для обновления Cursor
s.