在Android上处理SQLite表和游标

在Android上处理SQLite表和游标,android,android-contentprovider,android-sqlite,Android,Android Contentprovider,Android Sqlite,我很难在Android上优化SQLite数据库处理的向后兼容性、复杂性和最佳实践。我发现了两种管理SQLite数据库和游标的方法,它们没有被弃用: 直接通过android.database.sqlite ContentProvider,CursorLoader和loadermanger 我正在尝试设计数据库实现的未来证明。这意味着我想实施谷歌推广的最佳实践。在实现ContentProvider和LoaderManager时 如果我遵循Lars Vogels的建议,我的代码就会被重复和不必要的

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

  • 直接通过
    android.database.sqlite
  • ContentProvider
    CursorLoader
    loadermanger
我正在尝试设计数据库实现的未来证明。这意味着我想实施谷歌推广的最佳实践。在实现
ContentProvider
LoaderManager

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

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

我的问题:
您如何在Android上处理SQLite数据库?
您什么时候会更努力地实施
ContentProvider
LoaderManager

如何保持向后兼容

我目前的做法:

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

我最近遇到了同样的普通sqllite/内容提供商难题,而内容提供商似乎是解决这个问题的最常用方法

即使国家

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

他们添加了一个选项,使用

android:exported="false"
我读过的所有书籍,包括Reto Meier的专业Android开发4,都建议使用内容提供商

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

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

如果使用普通sqllite,则需要实现某种方法,以便在后台数据发生更改时通知客户机类。例如,我使用广播通知在intentservice中更新表的任何活动

最后,我对您所抱怨的所有代码重复感到有点失望,我决定编写一个python脚本,用数据模型的描述代替我生成内容提供者。您可能需要修改生成的类(或者更好,扩展它),但我认为这节省了很多时间。你可以找到它

结论

  • 如果您想将数据导出到其他应用程序(不太常见),则需要使用内容提供商
  • 如果您希望观察数据/更新ui,因为您的数据集可能会在后台更改,那么content provider+loader功能非常强大
  • 如果您有一个预加载的数据集,并且可能在显示数据的相同活动中更新它,或者您需要对表执行简单的操作,那么一个sqllite helper类就足够了

我不知道所有这些问题的答案,但我知道支持库与加载程序一起工作,一直到2.1。完美答案,在阅读后,我最终决定转到ContentProvider,这不仅仅是因为您的脚本非常有用!我也想过写一个脚本,但后来决定在这个问题上对ContentProvider大加指责,所以+1代表你们的业力:)很高兴能帮上忙。你可以在这里找到我个人的咆哮