似乎谷歌推荐的方式(使用android支持库)片段或活动与sqlite数据库交互是通过扩展AsyncTaskLoader的加载器,其工作方式类似于CursorLoader对ContentProviders的作用。
单个活动或片段可以以多种方式与数据库交互,更新,删除和查询一个或多个表中的数据。但是由于加载器只有一个地方可以进行数据库操作(即loadInBackground()
),开发人员是否希望为每种类型的交互编写单独的加载器,特别是因为它似乎是参数化的唯一方法。 loadInBackground()
中的行为是通过args
参数将参数传递给加载器的构造函数到LoaderManager.initLoader()
?
非常感谢。
答案 0 :(得分:2)
当不使用ContentProvider
时,即直接使用sqlite时,如果要执行的数据库操作集返回AsyncTaskLoader
,请使用Cursor
。该集可以包括任何类型的操作 - 更新,查询,删除,插入。这些操作应该在AsyncTaskLoader.loadInBackground()
。
如果数据库操作集未导致返回Cursor
,请使用AsyncTask
。在这种情况下,操作应该在AsyncTask.doInBackground()
。
答案 1 :(得分:1)
在您的应用中使用CursorLoader
优于Activity.managedQuery():
AsyncTaskLoader)
上,因此大型数据查询不会阻止UI。这是文档建议您在使用普通{{1}时为自己做的事情。 1}},但现在已经完成了。Cursor
正在自动更新。除了执行初始查询之外,CursorLoader还会向您请求的数据集注册CursorLoader
,并在数据集更改时自行调用ContentObserver
。这样,您可以在数据发生更改时随时更新forceLoad()
回调,以便更新视图。每个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的加载器,即您执行的每种类型的查询。