【发布时间】:2014-04-01 12:56:20
【问题描述】:
我遇到了数据库锁定问题。我有一个扩展 Activity 并仅在那里创建数据库实例的类。 这是我的超级班
public class Example extends Activity
{
protected DBUtil mDbUtil;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDbUtil = DBUtil.getInstance(getApplicationContext());
}
@Override
public void finish() {
super.finish();
mDbUtil.close();
}
}
这是我的数据库类
public class DBUtil extends SQLiteOpenHelper {
public static DBUtil getInstance(Context context) {
if(mInstance == null && context != null) {
mInstance = new DBUtil(context);
mDatabase = mInstance.getWritableDatabase();
}
if(mDatabase!=null && !mDatabase.isOpen())
{
mDatabase=mInstance.getWritableDatabase();
}
return mInstance;
}
public boolean replaceOrUpdate(DBListener dbListener,final String sTable, ContentValues[] contentValues) {
this.mDbListener=dbListener;
if(mDatabase == null) {
mDatabase = getWritableDatabase();
}
mDatabase.beginTransaction();
try {
int count = contentValues.length;
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
debug("Insert id = " + id);
}
mDatabase.setTransactionSuccessful();
mDbListener.onCompleteInsertion();
}catch (Exception e) {
Log.v("Exception = " , " " + e.toString());
e.printStackTrace();
}finally {
mDatabase.endTransaction();
}
return true;
}
public boolean replaceOrUpdate(final String sTable, ContentValues[] contentValues) {
if(mDatabase == null) {
mDatabase = getWritableDatabase();
}
mDatabase.beginTransaction();
try {
int count = contentValues.length;
for (int i=0; i<count;i++) {
ContentValues value = contentValues[i];
long id = mDatabase.replaceOrThrow(sTable,null,value);
debug("Insert id = " + id);
}
mDatabase.setTransactionSuccessful();
}catch (Exception e) {
Log.v("Exception = " , " " + e.toString());
}finally {
mDatabase.endTransaction();
}
return true;
}
public void close() {
if(mDatabase != null) {
miDbOpenCounter--;
mDatabase.close();
}
mInstance = null;
mDatabase = null;
}
}
我的所有活动都扩展了示例
我打开Activity A(未完成)->Activity B(未完成)->Activity C
Activity c 在插入 Db 后通过调用 finish() 返回结果并自行关闭。但是在插入时它给了我mDatabase.endTransaction(); 错误,这里是 nullPointer 异常,然后是数据库锁定异常
04-01 18:19:24.624: I/SQLiteConnectionPool(25638): The connection pool for +data+data+com_example_Example+databases+Example_db has been closed but there are still 1 connections in use. They will be closed as they are released back to the pool.
04-01 18:19:24.624: W/System.err(25638): java.lang.NullPointerException
04-01 18:19:24.639: W/System.err(25638): at com.example.examp.DBUtil.replaceOrUpdate(DBUtil.java:150)
04-01 18:19:24.639: W/System.err(25638): at com.example.examp.SignupMerchant.onCompleted(SignupMerchant.java:342)
04-01 18:19:24.639: W/System.err(25638): at com.example.examp.ExampleAsyncTask.onPostExecute(ExampleAsyncTask.java:284)
04-01 18:19:24.639: W/System.err(25638): at com.example.examp.ExampleAsyncTask.onPostExecute(ExampleAsyncTask.java:1)
04-01 18:19:24.639: W/System.err(25638): at android.os.AsyncTask.finish(AsyncTask.java:631)
04-01 18:19:24.639: W/System.err(25638): at android.os.AsyncTask.access$600(AsyncTask.java:177)
04-01 18:19:24.639: W/System.err(25638): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
04-01 18:19:24.639: W/System.err(25638): at android.os.Handler.dispatchMessage(Handler.java:99)
04-01 18:19:24.639: W/System.err(25638): at android.os.Looper.loop(Looper.java:176)
04-01 18:19:24.684: D/dalvikvm(25638): GC_FOR_ALLOC freed 1556K, 27% free 22981K/31248K, paused 43ms, total 43ms
04-01 18:19:24.684: W/System.err(25638): at android.app.ActivityThread.main(ActivityThread.java:5419)
04-01 18:19:24.684: W/System.err(25638): at java.lang.reflect.Method.invokeNative(Native Method)
04-01 18:19:24.684: W/System.err(25638): at java.lang.reflect.Method.invoke(Method.java:525)
04-01 18:19:24.684: W/System.err(25638): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
04-01 18:19:24.684: W/System.err(25638): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
04-01 18:19:24.684: W/System.err(25638): at dalvik.system.NativeStart.main(Native Method)
04-01 18:19:27.524: E/SQLiteLog(25638): (5) database is locked
04-01 18:19:27.544: E/SQLiteDatabase(25638): Failed to open database '/data/data/com.example.examp/databases/Example.db'.
04-01 18:19:27.544: E/SQLiteDatabase(25638): android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
04-01 18:19:27.544: E/SQLiteDatabase(25638): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
04-01 18:19:27.544: E/SQLiteDatabase(25638): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1118)
04-01 18:19:27.544: E/SQLiteDatabase(25638): at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:825)
有什么办法摆脱这个吗?
【问题讨论】:
标签: android database database-connection android-sqlite