Intereting Posts
Как я могу поддерживать состояние фрагмента при добавлении в задний стек? Как вызвать методы Сервиса из активности? Разработка Android: наличие AsyncTask в отдельном файле класса Как я могу использовать контекстную панель действий в библиотеке поддержки Android? Facebook Войти CallbackManager FacebookCallback не называется? Параметры SQLquery для Android SQLite Просмотр в ScrollView не соответствует родительскому элементу NoClassDefFoundError при запуске Testmentation test with ant Как управлять базой данных с 400 000 записей в iPhone и Android? Разница между <include> и <ViewStub> в android В Android, как передать предопределенную поверхность для MediaCodec для кодирования? Как открыть страницу Facebook Fan и проверить, понравилось ли пользователю Android намерение начать Основное действие приложения События VideoView onTouch: приостановить / возобновить видео и показать / скрыть MediaController и ActionBar Вопросы по регистрации в Android HTTP

Android SQLiteException: не удалось изменить локаль для db в 'en_US'

Недавно я обновил одно из моих (открытых исходных) приложений для Android, и мои пользователи получают исключение, которое я не могу реплицировать. Ключевыми частями являются:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)

а потом

Caused by: android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db' to 'en_US'.

Это происходит на устройствах с Android 2.3 – 4.2.1 и в нескольких местах в приложении, где я пытаюсь подключиться к базе данных. Я закрываю базу данных после ее использования.

Я не могу найти много информации об исключении «не удалось изменить locale for db». Когда я смотрю на источник SQLiteConnection (строка 386), это кажется проблемой либо с таблицей «android_metadata», либо с обновлением индексов с использованием новой локали.

Вот код, вызывающий исключение (в Github).

 java.lang.RuntimeException: An error occured while executing doInBackground() at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) at java.util.concurrent.FutureTask.setException(FutureTask.java:219) at java.util.concurrent.FutureTask.run(FutureTask.java:239) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:856) Caused by: android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db' to 'en_US'. at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:386) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:854) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.airlocksoftware.database.DbInterface.(DbInterface.java:28) at com.airlocksoftware.hackernews.loader.StoryLoader.loadStories(StoryLoader.java:62) at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:54) at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:1) at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:240) at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51) at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40) at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123) at java.util.concurrent.FutureTask.run(FutureTask.java:234) ... 3 more Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:548) at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:364) ... 24 more 

Solutions Collecting From Web of "Android SQLiteException: не удалось изменить локаль для db в 'en_US'"

Это не полностью отвечает на вопрос, но вы также можете проверить эту статью и посмотреть, можете ли вы поработать над этим в своем DbHelperSingleton , поскольку, похоже, это та же ошибка, с которой вы сталкиваетесь:

Не удалось изменить локаль для db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' to 'en_US'

Проверьте содержимое своей базы данных, особенно «android_metadata». Это таблица с этим DDL:

 CREATE TABLE android_metadata ( locale TEXT ); 

Который должен содержать по крайней мере одну запись с этим контентом:

 en_US 

Это решило мою собственную проблему.

Больше подробностей:
Откройте файл базы данных с помощью редактора sqlite, такого как SQLiteStudio, затем откройте таблицу android_metadata (если она не существует, создайте ее (вы можете создать ее с помощью редактора запросов (инструменты> открыть редактор запросов) и скопировать / вставить код DDL выше)

Для вставки записи вы можете скопировать / вставить эту строку в редактор запросов:

 insert into android_metadata values ('en_us'); 

Совет: для запуска запроса в SQLiteStudio вы должны нажать кнопку с освещение Значок на панели инструментов.

Ключ – это android.database.sqlite.SQLiteDatabaseLockedException .

У меня была такая же проблема, и она продолжала расти с увеличением блокировки базы данных.

Что делать? – Исключить блокировку базы данных.

Как? – Убедитесь, что одновременные вызовы записи не выполняются, и

Вы можете больше узнать об избежании блокировки базы данных здесь и в этом очень хорошо объясненном SO-ответе .

Я бы предложил переместить все ваши вызовы на запись в одном потоке, таким образом избегая блокировки. Вы можете использовать AsyncQueryHandler для этого.

Если вы изменили свой язык в приложении, убедитесь, что вы его изменили, прежде чем открывать свою базу данных.

У меня была такая же проблема в моем приложении, когда я переключал язык после открытия моей базы данных, и он пытался переключиться на другую базу данных на основе локали, которой не было.