Я пишу приложение для Android, используя sqlite
. Есть много мероприятий и одна услуга. Я использую БД из нескольких потоков. Он отлично работает в Android 2.X
, но когда я запускаю его в Android 3.X
он всегда выдает эту ошибку и Force Close
:Android sqlite with multi thread
05-04 22:17:04.815: I/SqliteDatabaseCpp(8774): sqlite returned: error code = 5, msg = database is locked, db=/data/data/xxx/databases/im
05-04 22:17:04.815: E/SqliteDatabaseCpp(8774): sqlite3_open_v2("/data/data/xxx/databases/im", &handle, 6, NULL) failed
05-04 22:17:04.835: E/SQLiteDatabase(8774): Failed to open the database. closing it.
05-04 22:17:04.835: E/SQLiteDatabase(8774): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:790)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
05-04 22:17:04.835: E/SQLiteDatabase(8774): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
Любой знает, почему это происходит и как ее решить?
Я исследовал в Интернете и большинство людей советуют:
- Используйте одно соединение с базой данных только для приложения. Как это обеспечить? Я хочу поделиться соединением БД для службы и деятельности. Должен ли я сделать это, создав публичную статическую переменную БД?
- ContentProvider - Я использую сложный SQL-запрос в коде (например, объединение нескольких таблиц, временная таблица). Можно ли запустить эту сложную инструкцию SQL в ContentProvider?
Спасибо всем. Наконец, (1) отлично работает для меня. Но я все еще удивляюсь, почему Android 2.X не имеет этой проблемы.
1) работает только в том случае, если весь доступ происходит с тем же процессом, 2) работает до тех пор, пока все, что вам нужно, это вставка/запрос/обновление/удаление, но сложные запросы выглядят уродливыми, так как вы ограничены разработчиком http: // .android.com/reference/android/content/ContentResolver.html интерфейс – zapl
Благодаря zapl, DB не используется совместно с другими приложениями. Я думаю (1) хорошо для меня. Вы даже не подозреваете, почему Android 2.X не имеет этой проблемы? –
вы должны пойти по этой ссылке http://stackoverflow.com/questions/7930139/android-databse-locked –