gpt4 book ai didi

Android:如何使用 CursorAdapter?

转载 作者:IT老高 更新时间:2023-10-28 23:29:34 24 4
gpt4 key购买 nike

我有一个数据库、一个 ListView 和一个扩展 CursorAdapterCustomCursorAdapter。一个菜单按钮将一个项目添加到数据库中。我希望 ListView 更新并显示此更改。通常它不会显示这个新项目,直到我进入主屏幕并重新打开应用程序。

每当我添加新项目时,我确实通过调用 cursor.requery()mCustomCursorAdapter.changeCursor(newCursor) 最终让它工作,但是当我设置 autoRequery在 CursorAdapter 构造函数中设置为 false,它的工作原理是一样的。为什么 autoRequery 设置为 false 时会正确更新?

我是否正确使用了 CursorAdapter?保持列表随数据库更新的标准方法是什么? autoRequery 有什么作用?

最佳答案

自动更新 Cursors 的惯用且正确的方法是调用 Cursor#setNotificationUri当它们被创建时,在它们被交给任何请求它们之前。然后调用ContentResolver#notifyChangeCursor 的 Uri 命名空间中的任何内容发生变化时。

例如,假设您正在创建一个简单的邮件应用程序,并且您想在新邮件到达时进行更新,同时还提供邮件的各种 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);

我还应该通知所有选择用于标记此新消息的 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() 调用发生在访问数据的地方。因此,如果它位于 ServiceContentProvider 中,那么您就是 setNotificationUrinotifyChange。您不应该从访问数据的地方执行此操作,例如 Activity

AlarmProvider是一个简单的ContentProvider,它使用这个方法来更新Cursors。

关于Android:如何使用 CursorAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com