我有一个数据库,一个ListView
和一个扩展了CustomCursorAdapter
的CursorAdapter
。菜单按钮将一个项目添加到数据库。我希望ListView
更新并显示此更改。通常,直到我转到主屏幕并重新打开应用程序,它才会显示此新项目。
每当添加新项目时,我最终都通过调用cursor.requery()
或mCustomCursorAdapter.changeCursor(newCursor)
使其工作,但是当我在CursorAdapter
构造函数中将autoRequery设置为false时,它的工作原理相同。当autoRequery设置为false时,为什么它可以正确更新?
我是否正确使用CursorAdapter
?用数据库更新列表的标准方法是什么?以及autoRequery有什么作用?
最佳答案
自动更新Cursor
的惯用且正确的方法是在创建 Cursor#setNotificationUri
并将其移交给任何请求的对象之前调用 ContentResolver#notifyChange
。然后,当Cursor
的Uri命名空间中的任何内容发生更改时,调用 Cursor
。
例如,假设您正在创建一个简单的邮件应用程序,并且想要在收到新邮件时进行更新,但还希望提供有关该邮件的各种 View 。我将定义一些基本的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);
我还应该通知为该新消息遇到的标签选择的所有
getContentResolver()
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);
Service
调用发生在访问数据的位置。因此,如果它在ContentProvider
或setNotificationUri
中,则是notifyChange
和Activity
所在的位置。您不应该从访问数据的地方(例如AlarmProvider
)进行操作。ojit_a是使用此方法更新
ContentProvider
的简单Cursor
。关于android - Android:如何使用CursorAdapter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3544913/