1

似乎 Google 推荐的片段或活动与 sqlite 数据库交互的方式(使用 android 支持库)是通过扩展 AsyncTaskLoader 的加载器,其工作方式类似于 CursorLoader 为 ContentProviders 所做的方式。

单个活动或片段可以以多种方式与数据库交互,更新、删除和查询一个或多个表中的数据。loadInBackground()但是由于加载器只有一个地方来执行数据库操作(即loadInBackground()在加载器构造函数的args参数通过LoaderManager.initLoader()?

非常感谢。

4

3 回答 3

2

不使用 aContentProvider时,即直接使用 sqlite 时,AsyncTaskLoader如果要执行的数据库操作集返回 a ,则使用Cursor。该集合可以包括任何类型的操作——更新、查询、删除、插入。这些操作应该在AsyncTaskLoader.loadInBackground().

如果这组数据库操作没有导致 aCursor被返回,请使用AsyncTask. 在这种情况下,操作应该在AsyncTask.doInBackground().

于 2012-01-27T07:32:17.850 回答
1

根据之前的答案,我不确定这是否正是您要问的。但是,是的,您必须为每个数据集(即您执行的每种查询类型)创建一个具有唯一 ID 的加载器。

于 2012-06-13T16:13:30.003 回答
1

CursorLoader在您的应用程序中使用 a 有两个主要好处Activity.managedQuery():

  1. 查询是在后台线程上为您处理的(由于构建在AsyncTaskLoader)如此大的数据查询上不会阻塞 UI。这是文档建议您在使用 plain 时为自己做的事情Cursor,但现在它已经在后台完成了。
  2. CursorLoader正在自动更新。除了执行初始查询之外,CursorLoaderContentObserver还向您请求的数据集注册 a 并forceLoad()在数据集更改时调用它自己。这会导致您async在数据更改时收到回调以更新视图。

每个 Loader 实例也通过 single 处理LoaderManager,因此您仍然不必直接管理游标,现在连接甚至可以持续超过一个Activity. LoaderManager.initLoader(),并LoaderManager.restartLoader()允许您重新连接已为您的查询设置的现有 Loader,并且,在某些情况下,如果可用,立即获取最新数据。

您的 Activity 或 Fragment 现在可能会实现LoaderManager.Callback 接口。调用initLoader()将产生 onCreateLoader() 方法,您将在其中构造查询和新CursorLoader实例(如有必要)。onLoadFinished()每次有新数据可用时都会触发该方法,并将包括最新的 Cursor 供您附加到视图或以其他方式迭代。

LoaderManager此外,在类文档页面上有一个很好的例子来说明所有这些组合在一起:http: //developer.android.com/reference/android/app/LoaderManager.html

希望有帮助!

于 2012-01-11T05:44:20.307 回答