0

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

两个目标:

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

这是我从这里和 Android 文档收集的内容:

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

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

更新: AsyncQueryHandler 不知道配置更改。我读过片段可能是要走的路。或者...我必须确保我的 AsyncQueryHandler 实现处理配置更改。

4

1 回答 1

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 之前,所有 Loader 共享一个线程池来并行执行请求。(在 HoneyComb 之后,Loader 会按顺序执行任务。)这意味着不仅不能保证彼此紧随其后执行的任务也不能保证按顺序执行,而且如果您没有正确处理多线程,还会出现数据一致性问题。

如果您在后台运行更新数据库的服务,您仍然需要担心 post-Honeycomb 中的多线程。

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

于 2013-07-14T00:15:06.580 回答