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