我已经用Google搜索并找到了多种异步访问本地SQLite数据库的方法:
最佳做法是什么?我目前有一个SQLiteOpenHelper子类,其中包含基本表创建/升级/等。逻辑。
答案 0 :(得分:8)
CursorLoader
仅支持查询。如果要在UI中显示数据,您可能仍希望使用它并利用Loader框架。 CursorLoader
旨在与ContentProvider
一起使用,但您可以复制源代码并修改它以获取SQLiteDatabase而不是Context并查询数据库而不是ContentResolver
内部loadInBackground()
方法。
对于写入操作,您有几个选项需要考虑(这些选项不是互斥的,根据具体情况,您最终可能会使用多个选项):
我通常使用AsyncTask
进行一次性操作,可能会产生轻微的UI影响(例如,在屏幕上显示和隐藏某些指示符)。请注意,AsyncTasks在单个工作线程上串行运行,除非您将自己的执行程序提供给execute()
。
IntentService
非常有用,因为它将所有启动命令排队并在工作线程上串行执行,并在完成所有启动时自动关闭。它是一个服务,因此它与任何活动/ UI组件分开运行,但这也意味着有一些开销,因为它是一个需要由系统创建和启动的应用程序组件。我喜欢它们用于批量操作或将来某个时间安排的操作。
AsyncQueryHandler
不仅仅是查询(不管它是如何命名的),但与CursorLoader
一样,它希望您与ContentProvider
进行通信。您可以使用单个处理不同类型的操作。重要的是要注意ContentProvider
本身不提供异步处理,您必须从后台线程调用它,这是AsyncQueryHandler
所做的。
最后,良好的旧Java线程和执行程序框架工作得很好,尽管您可能希望有一些应用程序组件供它们运行(可能是服务,但如果是这样的话)无论如何你可能只是使用上面的IntentService。
答案 1 :(得分:1)
CursorLoader
仅用于异步读取数据ContentProvider
是为其他应用程序提供数据,没有同步或异步访问的选项。我建议您使用AsyncTask