08-02 11:55:43.835 E/Database(20401): Error updating iscur=0 using UPDATE browserdata SET iscur=? WHERE iscur=?
08-02 11:55:43.835 E/DatabaseUtils(20401): Writing exception to parcel
08-02 11:55:43.835 E/DatabaseUtils(20401): android.database.sqlite.SQLiteException: error code 5: database is locked
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1736)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1665)
08-02 11:55:43.835 E/DatabaseUtils(20401): at com.tencent.qube.db.QubeBrowserDataProvider.update(QubeBrowserDataProvider.java:82)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.content.ContentProvider$Transport.update(ContentProvider.java:228)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:222)
08-02 11:55:43.835 E/DatabaseUtils(20401): at android.os.Binder.execTransact(Binder.java:336)
08-02 11:55:43.835 E/DatabaseUtils(20401): at dalvik.system.NativeStart.run(Native Method)
08-02 11:55:43.835 W/dalvikvm(20654): threadid=17: thread exiting with uncaught exception (group=0x40018560)
问题引起原因:多个provider公用一个database造成,用的SQLiteOpenHelper创建的数据库,执行mDBHelper.getWritableDatabase()时,因为SQLiteOpenHelper里面的方法时给方法名加锁,或者是以synchronized(this)的方式,表示只对当前类实例进行锁。
我们多个provider用了多个类实例,但是database是同一个,当多个provider同时,比如两个线程中,同时操作database时,比如同时插入数据到providerA,providerB,频繁就会出现这个问题。
解决办法就是一个provider对应一个数据库。