问题标签 [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.

0 投票
1 回答
1674 浏览

android - 使用 CursorLoader 获取所有者的电子邮件地址

我正在尝试用所有者的电子邮件填充 ArrayList。我在一个片段中这样做。这是我的代码:

我基本上使用了这里给出的例子,我只是把它改编成一个片段。

当片段被午餐时,应用程序崩溃,我得到这个错误:

(我的设备上有一个 Gmail 帐户)

0 投票
1 回答
459 浏览

android - 带有来自资产的数据库的 CursorAdapter

我想在我的应用程序中使用一个预先创建的数据库,然后使用游标加载器来呈现来自数据库的数据。首先,我根据本教程 [http://goo.gl/1XS84] 从 assets 文件夹中复制数据库,然后我想将 CursorLoader 与 CursorAdapter 一起使用。

CursorLoader 虽然需要一些数据库的查询 Uri,但我不知道我应该指定什么 URI。有什么帮助吗?

0 投票
5 回答
10357 浏览

android - 自定义 CursorLoader 和支持 ListView 的 CursorAdapter 之间的数据不同步

背景:

我有一个CursorLoader直接使用 SQLite 数据库而不是使用ContentProvider. 此加载程序与ListFragmentCursorAdapter. 到现在为止还挺好。

为简化起见,我们假设 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. 我试图了解它是如何工作的。

采取以下场景以更好地理解。

  1. 假设CursorLoader已经完成加载并且它返回Cursor现在有 5 行的 a。
  2. 开始显示这些Adapter行。它移动Cursor到下一个位置并调用getView()
  3. 此时,即使在呈现列表视图的过程中,也会从数据库中删除一行(例如,_id = 2)。
  4. 这就是问题所在-CursorAdapter已将 移动Cursor到与已删除行相对应的位置。该bindView()方法仍然尝试使用 this 访问该行的列Cursor,这是无效的并且我们得到异常。

问题:

  • 这种理解正确吗?我对上面的第 4 点特别感兴趣,我假设当一行被删除时,Cursor除非我要求,否则它不会被刷新。
  • 假设这是正确的,我如何要求我CursorAdapter丢弃/中止它ListView 正在进行的渲染,并要求它使用新的Cursor(通过Loader#onContentChanged()and返回Adapter#notifyDatasetChanged())来代替?

PS向版主提出的问题:是否应该将此编辑移至单独的问题?


编辑 2

根据各种答案的建议,我对 s 如何工作的理解似乎存在根本性错误Loader。事实证明:

  1. Fragmentor根本Adapter不应该直接操作。Loader
  2. 应该监视数据的Loader所有变化,并且只要数据变化就应该提供AdapterCursoronLoadFinished()

有了这种理解,我尝试了以下更改。- 没有任何操作Loader。refresh 方法现在什么都不做。

Loader另外,为了调试和内部发生的事情ContentObserver,我想出了这个:

这是我的片段FragmentLoaderCallback

现在,每当数据库发生变化(添加/删除行)时,应该调用的onChange()方法 - 对吗?ContentObserver我没有看到这种情况发生。我的ListView从未表现出任何变化。我看到任何变化的唯一一次是如果我明确地调用onContentChanged().Loader

这里出了什么问题?


编辑 3

好的,所以我重写了我Loader的直接从AsyncTaskLoader. 我仍然没有看到我的数据库更改被刷新,也没有看到我在数据库中插入/删除一行时被调用的onContentChanged()方法:-(Loader

只是为了澄清一些事情:

  1. 我使用了代码CursorLoader并只修改了一行返回Cursor. ContentProvider在这里,我用我的代码替换了对的调用DbManager(它反过来用于DatabaseHelper执行查询并返回Cursor)。

    Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();

  2. 我对数据库的插入/更新/删除是从其他地方发生的,而不是通过Loader. 在大多数情况下,数据库操作发生在后台Service,在少数情况下,从Activity. 我直接使用我的DbManager类来执行这些操作。

我仍然没有得到的是 -谁告诉我Loader一行已被添加/删除/修改?换句话说,在哪里被ForceLoadContentObserver#onChange()调用?在我的加载器中,我在以下位置注册了我的观察者Cursor

这意味着当它发生变化时有责任Cursor通知它。mObserver但是,然后 AFAIK,“光标”不是“实时”对象,它会在数据库中修改数据时更新它指向的数据。

这是我的 Loader 的最新版本:

0 投票
1 回答
95 浏览

android - 在可搜索的活动中使用 CursorLoaders

我正在尝试创建一个可与操作栏一起使用的可搜索活动。我有一个从 ContentProvider 提供数据的 CursorAdapter。

我难以理解的是为什么 API 示例(即 searchableDictonary)执行 managedQuery 而不是与 CursorLoaders 进行异步操作。

也许我错过了什么?

0 投票
1 回答
1374 浏览

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 . 在打开消息传递活动之前,我已经在两个方向上进行了测试,它们都工作正常,这只是当我在消息传递活动可见时旋转时出现的问题。我还尝试以纵向进入消息传递活动,单击一条消息将我带到另一个活动而不破坏消息传递活动,更改为横向,然后按回消息传递活动,一切都显示正常。

我无法弄清楚为什么在轮换后没有显示消息。我会非常感谢任何想法或帮助。我在下面包含了我的消息传递活动。

0 投票
1 回答
2149 浏览

android - Android SimpleCursorAdapter 到 CursorAdapter

SimpleCursorAdapter用来管理对数据库的查询,然后在ListView.

这是我的代码:

虽然乍一看,它按预期工作,但我相信这不应该是继续的方式,因为有CursorAdapter.

我知道这是一个菜鸟问题,但是自从现在开始在 Android 中编程以来,我仍然不太了解。

我怎样才能将它从使用传递SimpleCursorAdapterCursorAdapter?已经在互联网上搜索,但无法理解如何做到这一点。

不问代码只是一些方向。

谢谢

收藏夹

更新以下主要评论

MyAdapt 类:

这是正确的方法吗?

收藏夹

0 投票
2 回答
2265 浏览

android - Android 在 UI 线程上使用光标

我想知道何时或是否可以使用游标从 ui 线程上的 sqlite 数据库获取数据。基本上我使用游标加载器来获取游标。然后我想用那个光标做点什么。可以用主 ui 线程中的光标做某事吗?真的,我只需要从光标中读取一行。

0 投票
2 回答
6724 浏览

android - 在片段android中的CursorLoader中显示进度对话框

美好的一天,正如标题所说,任何人都知道如何在从片段中的 CursorLoader 加载数据时实现进度对话框。在这方面找不到任何例子。任何有关如何操作的链接或指南都将受到高度赞赏。谢谢

0 投票
1 回答
9640 浏览

android - setNotificationUri 的机制是什么?

我刚刚实现了一个 CursorLoader,效果很好!事实上,我不相信我的 ListView 会在底层数据发生变化时自动更新,直到我测试它。这显然是 setNotificationUri 的魔力。

我的问题是,它如何知道游标中的数据何时发生了变化?假设我悄悄地在某处插入了一行。底层机制是否不断地查询数据库并与过去的数据进行比较?如果数据集很大,那会不会非常低效?

在我使用游标加载器之前,我会在必要时手动刷新。我不必再这样做真是太好了,但是让 CursorLoader 在后台执行此操作是否有效?

0 投票
1 回答
4161 浏览

android - Android CursorLoader 和 LoaderManager 错误

我正在尝试在 10 的最小 API 上实现 CursorLoader 和 LoaderManager。

但是,我在 AsyncTaskLoader.class 的第 63 行不断收到 IllegalArgument 异常(发生异常的 AsyncTaskLoader.class 的源代码在下方和此链接处。

以下是错误时的堆栈:

我测试了我的内容提供程序,并验证了查询方法从我的 Sqlite 数据库返回了一个有效的游标。下面是我尝试实现 CursorLoader 和 LoaderManager 的活动的源代码:

有人在这里看到我做错了什么吗?

谢谢。


该应用程序似乎可以做到

然后它在那里抛出异常。

下面是logcat: