Android的SQLiteStatement(预处理语句)是否是线程安全的?即是“bind *,bind * ... execute”原子?

时间:2010-09-20 11:14:55

标签: sql android concurrency thread-safety prepared-statement

我想知道Android中的预处理语句(SQLiteStatement的实例)是否是线程安全的。特别是我要问的是以下情况:

在ContentProvider中,您可以在onCreate期间创建预编译的插入语句。然后,在重写insert方法中,您可以通过将一组参数绑定到它并在其上调用executeInsert来使用此语句。

我们知道ContentProvider必须以线程安全的方式编写。如果SQLiteStatement没有绑定每个线程的参数,则对提供者的insert方法的并发调用将改变语句的绑定并导致不可预测的行为。

Android自己的联系人提供程序以这种方式使用预准备语句(http://bit.ly/bDuKAT),因此我倾向于认为它们实际上是线程安全的。查看SQLiteStatement的源代码,我看不到如何(http://bit.ly/9M1Swv)。

那么,关于参数绑定的SQLiteStatement(或SQLiteProgram)是否是线程安全的?

2 个答案:

答案 0 :(得分:2)

the SQLiteStatement documentation中明确说明了

  

SQLiteStatement未在内部同步

因此,该类不是线程安全的,并且不会被多个线程同时使用而没有意外结果。

答案 1 :(得分:1)

如果它是两个单独的方法,那么它不可能是线程安全的:

mStatusUpdateDelete.bindLong(1, dataId);
mStatusUpdateDelete.execute();

第一个线程可以用{1}调用bindLong,然后用2调用第二个线程,然后两个线程都可以调用execute。因此,即使bindLongexecute 内部是线程安全的,也无济于事。