Android数据库最佳实践



实现数据库框架的"Android方式"是什么?

两个目标:

  1. 它应该足够通用,以便"数据库"可以是sqlite数据库或网络上的其他数据库
  2. 它应该是多线程安全的。(更新:所谓"线程安全",我的意思是它不应该在主UI线程中运行,数据库调用不应该相互冲突,系统应该知道如何将结果传达回主UI线程。)
  3. 更新:它应该知道配置更改(如更改手机方向)

这是我从这里和Android文档中收集到的:

  1. 使用LoaderManager查询数据
  2. 创建一个ContentProvider(1&2使其线程安全)
  3. 在ContentProvider和数据之间放入一个额外的类

但是,如何创建、更新和删除数据呢?据我所知,LoaderManager只是用于查询的。我应该使用AsyncQueryHandler吗?

更新:AsyncQueryHandler不知道配置更改。我读到碎片可能是一条路。或我必须确保我的AsyncQueryHandler实现能够处理配置更改。

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

经过一些研究,以下是如何使用Android类处理(2)和(3):

  • AsyncTask——不幸的是,AsyncTask不知道配置更改,所以你必须自己写(这会变得很难看)
  • 无头碎片-没有UI的碎片。您基本上必须编写自己的AsyncTaskLoader,这样才能克服这一点。(请参见此处http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/)
  • AsyncTaskLoader-似乎是前进的方向

Loader是为加载数据而设计的,但您也可以破解Loader来处理插入/更新。(您可以在loadInBackground()方法中执行任何您想要的操作。)

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

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

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

最新更新