内容提供者和内容观察者同步

时间:2011-11-04 17:07:53

标签: android database android-contentprovider synchronized contentobserver

我有一个运行的服务,其中包含一个SQLite DB和一个注册到DB的URI的内容观察器。内容观察器使用SQLiteOpenHelper来查询来自数据库的数据。因此,当通过Content Provider将新数据从其他应用程序放入服务DB时,将观察到更改的光标并查询要处理的数据。问题是如果我从其他应用程序快速插入数据,最终内容观察者和内容提供者打开数据库并导致SQLite错误与数据库锁定。

我正在使用getReadable和getWritable方法,并在使用它们之后关闭数据库和任何游标。似乎CP和CO不同步。我该如何解决这个问题?

更新 当我在摩托罗拉Atrix上测试时,我没有问题。当我在三星Galaxy Tab上测试时,我遇到了问题。在Atrix上,从我的catlog中的调试标签中可以看出,CO和CP同时打开了DB ...但仍然没有像Galaxy那样的问题。银河系给了我这个错误:

11-04 12:12:13.490: ERROR/SqliteDatabaseCpp(19978): sqlite3_open_v2("/data/data/my.package/databases/raw_data_buffer.db", &handle, 6, NULL) failed
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): Failed to open the database. closing it.
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at my.package.RawDataBufferDatabaseHelper.insert(RawDataBufferDatabaseHelper.java:93)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at my.package.NetService$NetworkPollingRunnable.run(NetService.java:166)
11-04 12:12:13.490: ERROR/SQLiteDatabase(19978):     at java.lang.Thread.run(Thread.java:1020)
11-04 12:12:13.490: WARN/dalvikvm(19978): threadid=9: thread exiting with uncaught exception (group=0x40189760)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978): FATAL EXCEPTION: Thread-14
11-04 12:12:13.490: ERROR/AndroidRuntime(19978): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
11-04 12:12:13.490: ERROR/AndroidRuntime(19978):     at my.package.RawDataBufferDatabaseHelper.insert(RawDataBufferDatabaseHelper.java:93)

11-04 12:12:13.490: ERROR/SqliteDatabaseCpp(19978): sqlite3_open_v2("/data/data/my.package/databases/raw_data_buffer.db", &handle, 6, NULL) failed 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): Failed to open the database. closing it. 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at my.package.RawDataBufferDatabaseHelper.insert(RawDataBufferDatabaseHelper.java:93) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at my.package.NetService$NetworkPollingRunnable.run(NetService.java:166) 11-04 12:12:13.490: ERROR/SQLiteDatabase(19978): at java.lang.Thread.run(Thread.java:1020) 11-04 12:12:13.490: WARN/dalvikvm(19978): threadid=9: thread exiting with uncaught exception (group=0x40189760) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): FATAL EXCEPTION: Thread-14 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:750) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 11-04 12:12:13.490: ERROR/AndroidRuntime(19978): at my.package.RawDataBufferDatabaseHelper.insert(RawDataBufferDatabaseHelper.java:93)

1 个答案:

答案 0 :(得分:3)

在这种情况下,关闭游标确实对任何事情没有任何影响。不要让您的CO直接访问数据库。使代码中的每个部分都通过ContentProvider,并且在内容提供程序中只打开一个可写连接和一个可读连接(制作这些实例变量)。这应该保持一致,因为那时你将只有一个数据库连接,你正在经历。只要您使用相同的数据库连接就可以了。 sqlite方法是可重入的。

相关问题