问题标签 [android-cursorloader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 使用 CursorLoader 获取所有者的电子邮件地址
我正在尝试用所有者的电子邮件填充 ArrayList。我在一个片段中这样做。这是我的代码:
我基本上使用了这里给出的例子,我只是把它改编成一个片段。
当片段被午餐时,应用程序崩溃,我得到这个错误:
(我的设备上有一个 Gmail 帐户)
android - 带有来自资产的数据库的 CursorAdapter
我想在我的应用程序中使用一个预先创建的数据库,然后使用游标加载器来呈现来自数据库的数据。首先,我根据本教程 [http://goo.gl/1XS84] 从 assets 文件夹中复制数据库,然后我想将 CursorLoader 与 CursorAdapter 一起使用。
CursorLoader 虽然需要一些数据库的查询 Uri,但我不知道我应该指定什么 URI。有什么帮助吗?
android - 自定义 CursorLoader 和支持 ListView 的 CursorAdapter 之间的数据不同步
背景:
我有一个CursorLoader
直接使用 SQLite 数据库而不是使用ContentProvider
. 此加载程序与ListFragment
由CursorAdapter
. 到现在为止还挺好。
为简化起见,我们假设 UI 上有一个删除按钮。当用户单击它时,我从数据库中删除一行,并调用onContentChanged()
我的加载器。此外,在onLoadFinished()
回调时,我调用notifyDatasetChanged()
我的适配器以刷新 UI。
问题:
当删除命令快速连续发生时,意味着快速连续onContentChanged()
调用,bindView()
最终将使用 stale data。这意味着一行已被删除,但 ListView 仍在尝试显示该行。这会导致光标异常。
我究竟做错了什么?
代码:
这是一个自定义 CursorLoader(基于Diane Hackborn 女士的建议)
我班级的一个片段ListFragment
,显示了LoaderManager
回调;以及refresh()
每当用户添加/删除记录时我调用的方法。
MyCursorAdapter
只是一个普通的,newView()
被覆盖以返回新膨胀的行布局 XML 并bindView()
使用Cursor
将列绑定到View
行布局中的 s。
编辑 1
在深入研究了这一点之后,我认为这里的根本问题是CursorAdapter
处理底层Cursor
. 我试图了解它是如何工作的。
采取以下场景以更好地理解。
- 假设
CursorLoader
已经完成加载并且它返回Cursor
现在有 5 行的 a。 - 开始显示这些
Adapter
行。它移动Cursor
到下一个位置并调用getView()
- 此时,即使在呈现列表视图的过程中,也会从数据库中删除一行(例如,_id = 2)。
- 这就是问题所在-
CursorAdapter
已将 移动Cursor
到与已删除行相对应的位置。该bindView()
方法仍然尝试使用 this 访问该行的列Cursor
,这是无效的并且我们得到异常。
问题:
- 这种理解正确吗?我对上面的第 4 点特别感兴趣,我假设当一行被删除时,
Cursor
除非我要求,否则它不会被刷新。 - 假设这是正确的,我如何要求我
CursorAdapter
丢弃/中止它ListView
正在进行的渲染,并要求它使用新的Cursor
(通过Loader#onContentChanged()
and返回Adapter#notifyDatasetChanged()
)来代替?
PS向版主提出的问题:是否应该将此编辑移至单独的问题?
编辑 2
根据各种答案的建议,我对 s 如何工作的理解似乎存在根本性错误Loader
。事实证明:
Fragment
or根本Adapter
不应该直接操作。Loader
- 应该监视数据的
Loader
所有变化,并且只要数据变化就应该提供Adapter
新Cursor
的onLoadFinished()
。
有了这种理解,我尝试了以下更改。- 没有任何操作Loader
。refresh 方法现在什么都不做。
Loader
另外,为了调试和内部发生的事情ContentObserver
,我想出了这个:
这是我的片段Fragment
和LoaderCallback
现在,每当数据库发生变化(添加/删除行)时,应该调用的onChange()
方法 - 对吗?ContentObserver
我没有看到这种情况发生。我的ListView
从未表现出任何变化。我看到任何变化的唯一一次是如果我明确地调用onContentChanged()
.Loader
这里出了什么问题?
编辑 3
好的,所以我重写了我Loader
的直接从AsyncTaskLoader
. 我仍然没有看到我的数据库更改被刷新,也没有看到我在数据库中插入/删除一行时被调用的onContentChanged()
方法:-(Loader
只是为了澄清一些事情:
我使用了代码
CursorLoader
并只修改了一行返回Cursor
.ContentProvider
在这里,我用我的代码替换了对的调用DbManager
(它反过来用于DatabaseHelper
执行查询并返回Cursor
)。Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();
我对数据库的插入/更新/删除是从其他地方发生的,而不是通过
Loader
. 在大多数情况下,数据库操作发生在后台Service
,在少数情况下,从Activity
. 我直接使用我的DbManager
类来执行这些操作。
我仍然没有得到的是 -谁告诉我Loader
一行已被添加/删除/修改?换句话说,在哪里被ForceLoadContentObserver#onChange()
调用?在我的加载器中,我在以下位置注册了我的观察者Cursor
:
这意味着当它发生变化时有责任Cursor
通知它。mObserver
但是,然后 AFAIK,“光标”不是“实时”对象,它会在数据库中修改数据时更新它指向的数据。
这是我的 Loader 的最新版本:
android - 在可搜索的活动中使用 CursorLoaders
我正在尝试创建一个可与操作栏一起使用的可搜索活动。我有一个从 ContentProvider 提供数据的 CursorAdapter。
我难以理解的是为什么 API 示例(即 searchableDictonary)执行 managedQuery 而不是与 CursorLoaders 进行异步操作。
也许我错过了什么?
android - 来自光标加载器的 ListFragment 无法在方向更改时显示任何内容
我正在开发一个使用 ActionBarSherlock 和ViewPagerIndicator构建的 Android 应用程序,minSDK 为 8(Android 2.2),targetSDK 为 16(Android 4.1),使用 Android 兼容库。我有一个应用程序的消息传递部分,其中消息存储在 SQLite 数据库中,并且我正在使用 CommonsWare 的cwac-loaderex将游标加载器与 SQLite 数据库一起使用。当活动加载时,一切正常并显示消息,但是当我旋转设备时,它只显示一个带有加载循环的 ListFragment。
打开 LoaderManager.enableDebugLogging(true) 现有的加载器在我旋转时被重用,我还尝试了 onDestroy 中的 getSupportLoaderManager().destroyLoader(ID) 并且正在创建新的加载器,但我仍然有相同的结果,带有加载圈的 ListFragment . 在打开消息传递活动之前,我已经在两个方向上进行了测试,它们都工作正常,这只是当我在消息传递活动可见时旋转时出现的问题。我还尝试以纵向进入消息传递活动,单击一条消息将我带到另一个活动而不破坏消息传递活动,更改为横向,然后按回消息传递活动,一切都显示正常。
我无法弄清楚为什么在轮换后没有显示消息。我会非常感谢任何想法或帮助。我在下面包含了我的消息传递活动。
android - Android SimpleCursorAdapter 到 CursorAdapter
我SimpleCursorAdapter
用来管理对数据库的查询,然后在ListView
.
这是我的代码:
虽然乍一看,它按预期工作,但我相信这不应该是继续的方式,因为有CursorAdapter
.
我知道这是一个菜鸟问题,但是自从现在开始在 Android 中编程以来,我仍然不太了解。
我怎样才能将它从使用传递SimpleCursorAdapter
到CursorAdapter
?已经在互联网上搜索,但无法理解如何做到这一点。
不问代码只是一些方向。
谢谢
收藏夹
更新以下主要评论
MyAdapt 类:
这是正确的方法吗?
收藏夹
android - Android 在 UI 线程上使用光标
我想知道何时或是否可以使用游标从 ui 线程上的 sqlite 数据库获取数据。基本上我使用游标加载器来获取游标。然后我想用那个光标做点什么。可以用主 ui 线程中的光标做某事吗?真的,我只需要从光标中读取一行。
android - 在片段android中的CursorLoader中显示进度对话框
美好的一天,正如标题所说,任何人都知道如何在从片段中的 CursorLoader 加载数据时实现进度对话框。在这方面找不到任何例子。任何有关如何操作的链接或指南都将受到高度赞赏。谢谢
android - setNotificationUri 的机制是什么?
我刚刚实现了一个 CursorLoader,效果很好!事实上,我不相信我的 ListView 会在底层数据发生变化时自动更新,直到我测试它。这显然是 setNotificationUri 的魔力。
我的问题是,它如何知道游标中的数据何时发生了变化?假设我悄悄地在某处插入了一行。底层机制是否不断地查询数据库并与过去的数据进行比较?如果数据集很大,那会不会非常低效?
在我使用游标加载器之前,我会在必要时手动刷新。我不必再这样做真是太好了,但是让 CursorLoader 在后台执行此操作是否有效?
android - Android CursorLoader 和 LoaderManager 错误
我正在尝试在 10 的最小 API 上实现 CursorLoader 和 LoaderManager。
但是,我在 AsyncTaskLoader.class 的第 63 行不断收到 IllegalArgument 异常(发生异常的 AsyncTaskLoader.class 的源代码在下方和此链接处。
以下是错误时的堆栈:
我测试了我的内容提供程序,并验证了查询方法从我的 Sqlite 数据库返回了一个有效的游标。下面是我尝试实现 CursorLoader 和 LoaderManager 的活动的源代码:
有人在这里看到我做错了什么吗?
谢谢。
该应用程序似乎可以做到
然后它在那里抛出异常。
下面是logcat: