一个活动或片段是否必须有一个单独的加载器来执行每个数据库操作的类型?

时间:2012-01-11 05:37:14

标签: android sqlite android-loadermanager android-cursorloader asynctaskloader

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

单个活动或片段可以以多种方式与数据库交互,更新,删除和查询一个或多个表中的数据。但是由于加载器只有一个地方可以进行数据库操作(即loadInBackground()),开发人员是否希望为每种类型的交互编写单独的加载器,特别是因为它似乎是参数化的唯一方法。 loadInBackground()中的行为是通过args参数将参数传递给加载器的构造函数到LoaderManager.initLoader()

非常感谢。

3 个答案:

答案 0 :(得分:2)

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

中执行

如果数据库操作集未导致返回Cursor,请使用AsyncTask。在这种情况下,操作应该在AsyncTask.doInBackground()

中执行

答案 1 :(得分:1)

在您的应用中使用CursorLoader优于Activity.managedQuery():

有两个主要好处
  1. 查询是在后台线程上为您处理的(由于构建在AsyncTaskLoader)上,因此大型数据查询不会阻止UI。这是文档建议您在使用普通{{1}时为自己做的事情。 1}},但现在已经完成了。
  2. Cursor正在自动更新。除了执行初始查询之外,CursorLoader还会向您请求的数据集注册CursorLoader,并在数据集更改时自行调用ContentObserver。这样,您可以在数据发生更改时随时更新forceLoad()回调,以便更新视图。
  3. 每个Loader实例也通过单数async处理,因此您仍然不必直接管理游标,现在连接可以持续超过单个LoaderManager和{{1允许您重新连接已经为查询设置的现有Loader,在某些情况下,如果可用,立即获取最新数据。

    您的活动或片段现在可能会实现Activity. LoaderManager.initLoader()。回调界面。如果需要,调用LoaderManager.restartLoader()将导致onCreateLoader()方法,您将在其中构造查询和新的LoaderManager实例。每次有新数据时都会触发initLoader()方法,并且将包含最新的Cursor,以便您附加到视图或以其他方式迭代。

    此外,在CursorLoader类文档页面上有一个非常好的例子:http://developer.android.com/reference/android/app/LoaderManager.html

    希望有帮助!

答案 2 :(得分:1)

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