2

SQLite DB 및 DB의 URI에 등록 된 콘텐츠 관찰자가 포함 된 서비스를 실행하고 있습니다. Content Observer는 SQLiteOpenHelper를 사용하여 DB에서 데이터를 쿼리합니다. 따라서 새로운 데이터가 Content Provider를 통해 다른 응용 프로그램의 서비스 DB에 저장되면 변경된 커서가 관찰되고 처리 할 데이터를 쿼리합니다. 문제는 내가 다른 사람의 응용 프로그램에서 빠른 속도로 데이터를 삽입하면 Content Observer와 Content Provider가 DB를 열고 데이터베이스 잠금과 함께 SQLite 오류가 발생합니다.콘텐츠 공급자 및 콘텐츠 옵저버 동기화

나는 getReadable 및 getWritable 메서드를 사용하고 DB 및 모든 커서를 사용한 후이를 닫습니다. CP와 CO가 동기화되지 않은 것처럼 보입니다. 이 문제를 어떻게 해결할 수 있습니까?

업데이트 Motorola Atrix에서 테스트 할 때 아무런 문제가 없습니다. 삼성 갤럭시 탭에서 테스트 할 때 문제가 발생합니다. 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) 

답변

3

: 갤럭시 날이 오류를 제공합니다. CO가 데이터베이스에 직접 액세스하지 않도록하십시오. 코드를 ContentProvider를 통해 전달하고 콘텐츠 공급자에서 쓰기 가능한 코드와 읽기 가능한 코드가 하나만 열려 있어야합니다 (이 인스턴스 변수를 만듭니다). 그러면 모든 것을 일관성있게 유지해야합니다. 왜냐하면 당신은 통과하려는 하나의 db 연결 만 가질 것이기 때문입니다. 같은 db 연결을 사용하는 한 괜찮습니다. sqlite 메서드는 재진입입니다.

+0

나는 업데이트를 게시했다 ... 나는 Atrix ...에 문제가 없기 때문에 이상하다. 단지 탭. 또한 콘텐츠 외부에서 응용 프로그램이 사용할 수있는 쿼리 기능을 구현하고 싶지 않기 때문에 콘텐츠 제공 업체를 사용하여 콘텐츠 관찰자에서 DB를 쿼리하고 싶지 않습니다. – jjNford

+0

이 답변을 표시하는 데 오랜 시간이 걸려서 죄송합니다. 이제 Android 플랫폼에 대한 더 많은 경험이 있습니다. 이는 매우 좋은 답변입니다. 고맙습니다. – jjNford

관련 문제