7

我很难优化 Android 上 SQLite 数据库处理的向后兼容性、复杂性和最佳实践。我发现了两种未弃用的方法来管理 SQLite 数据库和游标:

  • 直接通过android.database.sqlite
  • ContentProvider,CursorLoaderLoaderManager

我正在尝试设计数据库实现的未来证明。这意味着我想实施 Google 推广的最佳实践。我找到了一个关于实现ContentProviderLoaderManager.

如果我遵循 Lars Vogels 的建议,我的代码就会被重复和不必要的复杂性所破坏。这对我数据库中的某些表确实有意义。但是对于具有三个字段的映射表(例如)实现这一点是没有意义的。此外,我遇到ActionbarSherlock了回调接口的问题LoaderManager(有一个解决方案,但它会使我的数据处理类加倍)。

通过直接处理数据库和游标android.database.sqlite会引发资源管理问题(关闭游标!)并使我负责任务处理。

我的问题:
您如何在 Android 上处理 SQLite 数据库?
你什么时候加倍努力实施ContentProviderLoaderManager
你如何保持向后兼容?

我目前的方法:
我创建了一个将数据库 I/O(通过android.database.sqlite)与活动分开的类。所有方法都打开和关闭它们在执行期间(在我的活动之外)使用的游标,并根据需要返回对象或数据(而不是游标)。I/O 操作在AsyncTasks. 这种方法似乎非常过时。

4

1 回答 1

4

我最近遇到了同样的普通 sqllite / 内容提供者困境,看起来内容提供者是解决问题的最常见方法。

即使官方文档声明

如果您不打算与其他应用程序共享数据,则无需开发自己的提供程序

他们添加了让未导出的内容提供商使用的选项

android:exported="false"

我读过的所有书籍,包括 Reto Meier 的Professional Android Development 4,都建议使用内容提供程序。

此外,以大量样板代码为代价,您可以忘记多线程和开放游标问题。

无论如何,我不得不说,你从内容提供者/游标加载器组合中获得的最大优势是,只要底层数据发生变化,你的加载器就会自动得到通知。

如果你使用普通的 sqllite,你需要实现一些方法来让客户端类在后台数据发生变化时得到通知。例如,我使用广播来通知任何活动,即在意图服务中更新了表。

最后,我对您所抱怨的所有代码重复感到有些失望,因此我决定编写一个 python 脚本来仅使用数据模型的描述来生成内容提供程序。您可能必须修改生成的类(或者更好地扩展它),但我认为它可以节省很多时间。你可以在这里找到

结论

  • 如果您想将数据导出到其他应用程序(不那么常见),您需要使用内容提供商
  • 如果您想观察数据/更新 ui,因为您的数据集可能会在后台更改,内容提供程序 + 加载程序非常强大
  • 如果你有一个预加载的数据集,也许你在显示数据的同一个活动中更新它,或者你需要对你的表执行简单的操作,也许一个 sqllite 帮助类就足够了
于 2012-12-19T21:15:15.190 回答