user533844
user533844

Reputation: 2063

Android Database Locked

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

Answers (8)

Manoj Yadav
Manoj Yadav

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

Taha
Taha

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

Boycott A.I.
Boycott A.I.

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

Todd Davies
Todd Davies

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:

  • You only access the database from one SQLOpenHelper
  • You make sure you close all instances of database helpers once you have finished with them
  • You make sure you always end transactions with endTransaction() also if you do not set them successful (i.e. if you want to roll 'em back), in case you use transactions
  • You could try using OrmLite, I've not used it, but I've heard others here rave about it.

Upvotes: 50

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

JD2015
JD2015

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

Kevin Galligan
Kevin Galligan

Reputation: 17292

Use a single connection throughout your whole app. See here:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

Upvotes: 15

Kurtis Nusbaum
Kurtis Nusbaum

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

Related Questions