Reputation: 2063
I am getting following error. So how do I unlock my database?
10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11
10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49)
Upvotes: 47
Views: 92996
Reputation: 35
What we can do when we have been thrown an error like below.
android.database.sqlite.SQLiteDatabaseLockedException: database is locked
Database lock means the database is performing a task with some other threads and at the same time, other thread executing that time it occurs.
So the solution in my case is:
You have to check before executing query or doing transaction in database like this.
if(!sqLiteDatabase.isDbLockedByCurrentThread() && !sqLiteDatabase.isDbLockedByOtherThreads())
Upvotes: 0
Reputation: 144
In my case this error was due to common mistake. Initially, my SQLite database was populated by data received from JsonArray from MySQL. After I added additional column in SQLite database, the similar error happened. Simply, I forgot to add corresponding column in MySQL database.. :)
Upvotes: 0
Reputation: 18871
I had the same problem as I was trying to access my database via a ContentResolver
whilst I already had a direct SQLiteDatabase
connection open to it (required for transactions).
I solved it by changing the order of my code so the ContentResolver
stuff is done before my direct SQLiteDatabase
connection is opened.
I also removed some code so I no longer close my direct SQLiteDatabase
.
It is worth reading this answer as it provides a lot of other helpful guidance.
Upvotes: 0
Reputation: 5522
I think you have forgotten to close the database, or another thread is writing to the database when you are trying to write to it. SQLite
locks the database when it is writing to it to avoid corruption if another entity tries to write to the same database at the same time. Android, will only show a error in log cat, and the query you supplied will be just forgotten...
So, I recommend:
SQLOpenHelper
endTransaction()
also if you do not set them successful (i.e. if you want to roll 'em back), in case you use transactionsUpvotes: 50
Reputation: 89
I had the same problem, try using this
db.beginTransactionNonExclusive();
try {
//do some insertions or whatever you need
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
I tried with db.beginTransaction but it locked the bd
Upvotes: 7
Reputation: 31
I had a similar error. My problem was that I accidentally gave the databases of the two helper classes the same name so they consequently ended up accessing the same database simultaneously. So ensure you aren't accessing a single database with multiple helper classes.
Upvotes: 0
Reputation: 17292
Use a single connection throughout your whole app. See here:
http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection
Upvotes: 15
Reputation: 30825
The reason this is happening is because you can only have one connection to the database open at a time (this is to prevent race conditions when modifying the database). I'm guessing your connecting multiple times to your database from different threads? The easiest way to get around this is to just create a ContentProvider frontend for your database. This will be able to handle queries from multiple threads.
For more information, checkout this blogpost.
Upvotes: 8