【问题标题】:DB lock issue in androidandroid中的数据库锁定问题
【发布时间】:2014-05-26 07:51:56
【问题描述】:

下载和提取图像集时出现以下错误,然后出现不幸关闭的弹出窗口。请帮帮我

05-26 13:01:54.637: E/SQLiteLog(15753): (5) database is locked
05-26 13:01:54.657: E/SQLiteDatabase(15753): Failed to open database '/data/data/org.com.clipToonz/databases/clipToonz.db'.
05-26 13:01:54.657: E/SQLiteDatabase(15753): android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at org.com.clipToonz.dbUtilities.ImageSetHandler.getImageSetIDByNameAndParentID(ImageSetHandler.java:187)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at org.apache.cordova.plugin.ExtractPlugin$unZipTask.doInBackground(ExtractPlugin.java:145)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at org.apache.cordova.plugin.ExtractPlugin$unZipTask.doInBackground(ExtractPlugin.java:1)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-26 13:01:54.657: E/SQLiteDatabase(15753):     at java.lang.Thread.run(Thread.java:841)
05-26 13:01:54.657: W/dalvikvm(15753): threadid=26: thread exiting with uncaught exception (group=0x41760ba8)

以下代码用于插入图片详情

     DB_PATH=Constants.KEY_DBPATH;      
     String myPath = DB_PATH;
     db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READWRITE);      
     ContentValues values = new ContentValues();
     values.put(KEY_NAME,imageset.getName());
     values.put(KEY_PARENTID,imageset.getParentID());
     values.put(KEY_ISDIRECTORY ,imageset.getIsDirectory());
     values.put(KEY_CATEGORYID, imageset.getCategoryID());
     values.put(KEY_IMAGESETNAME, imageset.getImagesetName());
     values.put(KEY_PRIMARYNAME, imageset.getPrimaryName());

    // String query = "INSERT INTO " +imageset.getTableName()+ "("+KEY_IMAGESETNAME+","+KEY_NAME+","+KEY_PARENTID+","+KEY_ISDIRECTORY+","+KEY_CATEGORYID+","+KEY_PRIMARYNAME+") VALUES('"+imageset.getImagesetName()+"','"+imageset.getName()+"',"+imageset.getParentID()+","+imageset.getIsDirectory()+","+imageset.getCategoryID()+",'"+imageset.getPrimaryName()+"')";
     //System.out.println(imageset.getTableName());
    // Inserting Row
     //db.execSQL(query);
     db.insert(imageset.getTableName(), null, values);
     db.close(); // Closing database connection

并检测现有的图像细节

int returnValue=0;
    //String num;
            DB_PATH=Constants.KEY_DBPATH;
            String name=imagesetp.getName();
            int categoryid = imagesetp.getCategoryID();             
            String myPath = DB_PATH;
         db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READWRITE);
        String selectQuery="SELECT * FROM "+imagesetp.getTableName()+" WHERE "+KEY_NAME+"='"+String.valueOf(name)+"' AND parentid="+parentID+" AND categoryid ="+categoryid;
        System.out.println("selectQuery " + selectQuery);

        Cursor cursor = db.rawQuery(selectQuery,null);
        // try{
         if (cursor != null && cursor.getCount()!=0)             
             cursor.moveToFirst();           
            returnValue=Integer.parseInt(cursor.getString(0));

    // }

    // finally{
         //cursor.close();
        // db.close();
    // }
         cursor.close();
         db.close();
    return returnValue;

【问题讨论】:

  • 你能发布你的代码吗?当您尝试写入以读取模式打开的数据库时,可能会发生这种情况。
  • 什么是阅读模式?我是这个应用程序的新手。

标签: android sqlite cordova


【解决方案1】:

由于我还不能写 cmets(需要 50 声望),所以我在这里写 - 但不仅如此,这应该是你的答案:

您在另一行代码中尝试在数据库仍在使用时打开它。为避免不一致,数据库将自动锁定其他所有访问,但此访问除外。首先,您必须先分配此资源(使用 db.close() - 您的代码中似乎缺少该资源),然后才能在其他地方使用它。

更多:

SQLiteDatabase db = new DataBaseHelper(context).getReadableDatabase();

SQLiteDatabase db = new DataBaseHelper(context).getWritableDatabase();

是获取数据库的更常用方法。


编辑:

我想我发现了你的错误。下次请格式化您的代码 - 它会对您有所帮助!

if (cursor != null && cursor.getCount()!=0)             
             cursor.moveToFirst();           
            returnValue=Integer.parseInt(cursor.getString(0));

这是您的数据库在离开方法之前不会关闭的地方!您的功能将在返回后留下。在此返回之前放置一个db.close()

最好的问候 文斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2021-11-22
    • 2011-10-20
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多