【问题标题】:Database Locking issue android数据库锁定问题android
【发布时间】: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


    【解决方案1】:

    您的close() 方法将所有活动之间共享的static 变量设为空,而不管数据库在其他活动中是否仍处于打开状态。

    考虑重新设计您的应用,以便此处没有static 变量。每个活动都可以创建自己的数据库连接。

    【讨论】:

    • 如果我只在我的应用程序退出时关闭数据库连接。这会解决问题吗?
    • 它可能会防止崩溃,但不能解决静态数据及其共享所有权的固有问题。为此,最好的解决方案通常是通过消除静态性来摆脱共享所有权。
    • 酷。我去做。我将删除静态实现并切换回每个活动的一个实例。
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2021-11-22
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多