5

在我的应用程序中,我需要很多 CRUD 内容:从本地 SQLite 数据库读取记录、插入对象和更新内容。大多数查询都非常简单,即使在 UI 线程上运行它们也不会阻塞,但是在这个应用程序中,我想采用 Windows Phone 模式:输出动画立即开始,当结果传递时开始动画。

我计划使用一个AsyncTask来完成这项工作,但是我注意到 Honeycomb(和 compat 包)引入了这个新的Loader 框架。主要优势似乎是Loader生存配置更改加载的数据。Commonsware的LoaderEx项目在 SQLite 和框架之间架起了桥梁,但出现了一些问题。

  1. 资源清理:我使用单个活动,在其中创建 SQLiteOpenHelperonCreate()并关闭它onDestroy()。由于加载器管理器可能仍在运行,我检查它并pendingClose在我的回调对象上设置一个标志,因此它会在加载完成时关闭游标和助手。我认为不关闭数据库是无害的,但如果你不这样做,SQLite 会抱怨,而且我不喜欢错误消息 :) 这里的重点是数据无法在配置更改后继续存在,因此 Loader 的优势消失了

  2. 我应该创建多少个加载器?假设我有心爱的Customer人和Order桌子。加载程序由ID'likeCUST_L或标识ORD_L,但每次用户单击一些摘要时,我都想带入一个包含详细信息的屏幕。我应该restart使用不同参数的加载器,还是应该init使用随机 ID 的新加载器?这可能会发生数十次。Loader 框架是为大量运行中的小型作业设计的,还是只为一些长时间运行的任务而设计的?

  3. 在界面中使用ID's的目的是什么?LoaderCallbacks为什么不简单initLoader(params, callback)?我不认为可以在回调中重用某些逻辑:最终他将分支(带有if-elseswitch在 ID 上)所以我不明白为回调对象提供标识符的意义,而不是一种天真的方法-每次操作的回调

我问这个是因为整个框架对我来说似乎过度设计并且没有真正的实用性。我不明白用 a 集中代码的意义LoaderManager,而且我看不到任何AsyncTask没有提供的新机会。

唯一的胜利点是配置更改生存,但由于资源清理,我无法利用它,而且我无法找到关闭它的替代方法,SQLiteOpenHelper因为(很明显)SQLiteCursorLoader需要它但清理它取决于用户。所以AsyncTask这里似乎是获胜者的选择,但也许我错过了一些东西。

4

1 回答 1

4
  1. 内容提供者比“原始数据库”方法强大得多。stackoverflow 上的许多链接引发了对此的讨论。
  2. LoaderManager 尝试通过 ID 来区分加载程序(这就是 initLoader 的签名指定此参数的原因)。如果具有特定 ID 的加载器的数据已经存在(因此无需再次异步重新加载),则需要加载器的 ID 来重新传递缓存的结果。
  3. restartLoader 调用强制 LoaderManager 启动由先前创建的加载程序指定的异步操作。initLoader 在创建新加载器之前尝试重用现有加载器。
  4. 片段和活动有自己的不重叠的 LoaderManager。

我的经验表明,尽管使用 Content Providers 听起来有点矫枉过正,但实际上它在未来会带来相当不错的回报。性能影响微不足道(尝试测量它),UI-Data 绑定是开箱即用的(因为内容观察者和 CursorLoaders 能够订阅 Uri 通知),由框架通过加载器实现的同步性。恕我直言,每当需要数据库时,大多数时候使用带有加载器的内容提供程序是您能想到的最佳解决方案。

其他涉及直接使用数据库的场景将迫使您手动实现所有内容。

于 2013-02-12T01:57:37.180 回答