Android数据库最佳做法?

时间:2013-07-11 01:19:34

标签: android multithreading thread-safety android-contentprovider android-loadermanager

实施数据库框架的“Android方式”是什么?

这两个目标:

  1. 它应该是通用的,以便“数据库”可以是sqlite数据库或网络上的东西。
  2. 它应该是多线程安全的。 (更新:通过“线程安全”,我的意思是它不应该在主UI线程中运行,数据库调用不应该相互冲突,系统应该知道如何将结果传回主UI线程。)
  3. 已更新:应了解配置更改(例如更改手机方向)
  4. 这是我从这里收集的以及Android文档:

    1. 使用LoaderManager查询数据。
    2. 创建一个ContentProvider(1& 2使其线程安全)
    3. 在ContentProvider和数据之间添加一个额外的类。
    4. 但是,创建,更新和删除数据呢?据我所知,LoaderManager仅用于查询。我应该使用AsyncQueryHandler吗?

      更新: AsyncQueryHandler不了解配置更改。我已经读过碎片可能是要走的路。或者......我必须确保我的AsyncQueryHandler实现处理配置更改。

1 个答案:

答案 0 :(得分:1)

(1)非常简单:只需在ContentProvider和实现所有低级CRUD的数据之间添加一个额外的类。例如,一个类可以处理sqlite数据库,另一个具有相同接口的类可以处理Google驱动器后端。

在做了一些研究后,以下是如何使用Android类处理(2)和(3):

  • AsyncTask - 遗憾的是,AsyncTask不知道配置更改,因此您必须自己编写(并且它变得难看)。
  • 无头碎片 - 没有UI的碎片。你基本上必须编写自己的AsyncTaskLoader,以便击败这一点。 (见http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/
  • AsyncTaskLoader - 似乎是要走的路

加载器旨在加载数据,但您可以破解加载器以处理插入/更新。 (您可以在loadInBackground()方法中执行任何操作。)

问题是,在HoneyComb之前,所有Loaders共享一个线程池以并行执行请求。 (在HoneyComb之后,Loaders按顺序执行任务。)这意味着不仅在彼此之后立即执行的任务不能保证按顺序执行,而且如果不能正确处理多线程,则会出现数据一致性问题。

如果您在后台运行了一个更新数据库的服务,您仍然需要担心后蜂窝中的多线程。

最重要的是,似乎没有Android框架抽象出“数据库调用不应该相互冲突”的问题。你必须自己处理。

相关问题