Android - sqlite内容提供程序和多线程

时间:2011-08-02 13:23:43

标签: android sqlite android-contentprovider

我对内容提供商有点困惑。 如果我在我的应用程序中有多个活动,他们每个人都会获得自己的内容提供者实例吗?它本质上只是一个类/接口?

在一个活动中,我将有许多线程同时写入数据库。我如何处理允许一个线程一次写入?

我是否只是捕获SQLiteDatabaseLockedException,将线程置于休眠状态然后重试? 或者有更好的方法吗?

当活动暂停/被销毁时是否释放数据库锁?如果是这样,我可以创建一个针对内容提供商本身的同步锁?

3 个答案:

答案 0 :(得分:3)

如果直接使用数据库并且有多个来自不同线程的编写器,则可能会遇到并发问题。

ContentProvider可以同时从多个程序访问,因此您必须实现访问线程安全。最简单的方法是在synchronized的所有方法前面使用关键字ContentProvider,这样只有一个线程可以同时访问这些方法。

如果您不要求Android同步ContentProvider的数据访问权限,请在AndroidManifest.xml文件中的android:multiprocess=true定义中设置<provider>属性。这允许在每个客户端进程中创建提供程序的实例,从而无需执行进程间通信(IPC)。

答案 1 :(得分:1)

糟糕,我丢失了未注册的用户cookie,因此无法将Femi的答案投票正确。

文档http://developer.android.com/guide/topics/providers/content-providers.html证实了这一点 “当启动查询时,Android系统会识别作为查询目标的内容提供程序,并确保它已启动并运行。系统将实例化所有ContentProvider对象;您永远不需要自己执行此操作。事实上,您根本不会直接处理ContentProvider对象。通常,每种类型的ContentProvider只有一个实例。但它可以与不同应用程序和进程中的多个ContentResolver对象进行通信。进程之间的交互由ContentResolver和ContentProvider类处理。 “

答案 2 :(得分:-4)

如果您使用的是ContentProvider,我相信您并不关心有多少线程在读/写:Android平台会处理将所有调用编组到一个线程上并整理出同步和锁定。您只需打开数据库并读/写,然后其他人通过ContentProvider界面进行通信。