Синхронизация поставщика контента и обозревателя контента - PullRequest
2 голосов
/ 04 ноября 2011

У меня запущена служба, которая содержит БД SQLite и Обозреватель контента, зарегистрированный в URI БД. Content Observer использует SQLiteOpenHelper для запроса данных из БД. Таким образом, когда новые данные помещаются в базу данных служб из другого приложения через контент-провайдер, будет наблюдаться измененный курсор и запрашивать данные для обработки. Проблема заключается в том, что если я вставляю данные в быстром темпе из других приложений, я получаю, что Content Observer и Content Provider открывают БД и вызывают ошибку SQLite при блокировке базы данных.

Я использую методы getReadable и getWritable и закрываю БД и любые курсоры после их использования. Просто кажется, что CP и CO не синхронизированы. Как я могу решить эту проблему?

UPDATE Когда я тестирую это на Motorola Atrix, у меня нет проблем. Когда я тестирую его на Samsung Galaxy Tab, у меня возникают проблемы. На Atrix из моих отладочных тегов в catlog видно, что и CO, и CP одновременно открывают базу данных ... но все еще не проблема, как в случае с Galaxy. Галактика выдает мне эту ошибку:

</p> <pre><code>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 Ответ

3 голосов
/ 04 ноября 2011

Закрытие курсоров на самом деле не влияет ни на что в этом случае. У вашего CO нет прямого доступа к базе данных. Сделайте так, чтобы каждый фрагмент вашего кода проходил через ContentProvider, и в вашем поставщике контента было открыто только одно доступное для записи и одно читаемое соединение (сделайте эти переменные экземпляра). Это должно поддерживать все согласованно, потому что тогда у вас будет только одно соединение с БД, через которое вы проходите. Пока вы используете одно и то же соединение с БД, все в порядке. Методы sqlite являются реентерабельными.

...