在Android上处理SQLite表和游标

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

  • 直接通过android.database.sqlite
  • ContentProviderCursorLoaderLoaderManager
  • 我试图设计数据库实现未来的证明。 这意味着我想实施Google推广的最佳做法。 我找到了一个关于实现ContentProviderLoaderManager的教程。

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

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

    我的问题:
    你是如何处理Android上的SQLite数据库的?
    你什么时候多花一点时间去实现ContentProviderLoaderManager
    你如何保持向后兼容?

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


    我最近有一个普通的sqllite /内容提供商的困境,看起来内容提供商是解决问题最常用的方法。

    即使官方文件指出

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

    他们添加了让未提交内容提供者使用的选项

    android:exported="false"
    

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

    而且,以许多样板代码为代价,您可能会忘记多线程并打开游标问题。

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

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

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

    结论

  • 如果你想将你的数据导出到其他应用程序(不常见),你需要去内容提供商
  • 如果你想观察数据/更新ui,因为你的数据集可能会在后台更改,内容提供商+加载程序是非常强大的
  • 如果你有一个预加载的数据集,也许你在显示数据的同一个活动中更新它,或者你需要对你的表执行简单的操作,也许一个sqllite辅助类就足够了
  • 链接地址: http://www.djcxy.com/p/67471.html

    上一篇: Handling SQLite tables and cursors on Android

    下一篇: Laravel Eloquent: Ordering results of all()