title: Android SQLiteException: Failed to change locale for db to 'en_US'
body: <p>I recently updated one of my (open-source) Android apps and my users are getting an exception that I can't replicate. The key parts are : </p>
  
  <p><code>android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)</code> </p>
  
  <p>and then </p>
  
  <p><code>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'.</code></p>
  
  <p>This is happening on devices with Android 2.3 - 4.2.1, and in multiple places within the app where I try to connect to a database. I am closing the database after I use it. </p>
  
  <p>I can't find much information about the "failed to change locale for db" exception. When I look at the <a href="http://bitgrind.com/android/android-4.1.1_r4/android/database/sqlite/SQLiteConnection.html">source for SQLiteConnection (line 386)</a> it seems to be a problem with either the 'android_metadata' table or 'updating the indexes using a new locale'.</p>
  
  <p><a href="https://github.com/bishopmatthew/HackerNews/blob/master/src/com/airlocksoftware/hackernews/loader/StoryLoader.java#L61">Here is the code that's causing the exception (on Github).</a></p>
  
  <pre><code>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
  </code></pre>