在Android上处理SQLite表和游标
我很难优化Android的SQLite数据库处理的向后兼容性,复杂性和最佳实践。 我发现了两种不被弃用的方式来管理SQLite数据库和游标:
android.database.sqlite
ContentProvider
, CursorLoader
和LoaderManager
我试图设计数据库实现未来的证明。 这意味着我想实施Google推广的最佳做法。 我找到了一个关于实现ContentProvider
和LoaderManager
的教程。
如果我遵循Lars Vogels的提议,我的代码就会被重复和不必要的复杂性所粉碎。 它对我的数据库中的某些表确实有意义。 但是,对于具有三个字段(例如)的映射表来实现这一点是没有意义的。 此外,我遇到了ActionbarSherlock
和LoaderManager
的回调接口问题(有一个解决方案,但它会使我的数据处理类加倍)。
通过android.database.sqlite
直接处理数据库和游标会引发资源管理问题(关闭游标!),并让我负责任务处理。
我的问题:
你是如何处理Android上的SQLite数据库的?
你什么时候多花一点时间去实现ContentProvider
和LoaderManager
?
你如何保持向后兼容?
我目前的做法:
我创建了一个类,它将数据库I / O(通过android.database.sqlite
)与活动分开。 所有方法打开和关闭它们在执行期间使用的游标(在我的活动之外),并根据需要返回对象或数据(而不是游标)。 I / O操作在AsyncTasks
中执行。 这种方法似乎很不赞成。
我最近有一个普通的sqllite /内容提供商的困境,看起来内容提供商是解决问题最常用的方法。
即使官方文件指出
如果您不打算与其他应用程序共享数据,则不需要开发自己的提供程序
他们添加了让未提交内容提供者使用的选项
android:exported="false"
我读过的所有书籍,包括Reto Meier的专业Android开发4,都建议使用内容提供商。
而且,以许多样板代码为代价,您可能会忘记多线程并打开游标问题。
无论如何,我不得不说,从内容提供者/游标加载器组合中获得的最大好处是,只要底层数据发生变化,您的加载器就会自动得到通知。
如果您使用普通sqllite,则需要实现某种方式,以便在后台数据发生更改时通知客户端类。 例如,我使用广播来通知任何活动,即在intentservice中更新的表。
最后,我对所有您所诟病的代码重复感到有点失望,并且我决定编写一个python脚本来使用数据模型的描述在我的位置生成内容提供者。 您可能必须修改生成的类(或者更好地扩展它),但我认为它可以节省很多时间。 你可以在这里找到它
结论 :