Android Attach数据库onupgrade锁定数据库

时间:2016-08-29 10:22:03

标签: android database sqlite android-sqlite

在升级方法上,我重命名我的数据库并从资产文件夹中复制新数据库。

但在Attach语句中,它会在"数据库锁定(代码)5"

上引发异常
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(oldVersion<newVersion){
     db.close();
        /**
         *  Renaming Database from Databse path
         * 
         */

        new File(Constants.DATABASE_PATH+Constants.DATABSE_NAME).renameTo(new File(Constants.DATABASE_PATH+Constants.DATABASE_NAME_RENAME));


        boolean mm = checkDataBase(Constants.DATABSE_NAME);


        boolean up = checkDataBase(Constants.DATABASE_NAME_RENAME);

        try {
        copyDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        boolean dbmm = checkDataBase(Constants.DATABSE_NAME);
        boolean dbup = checkDataBase(Constants.DATABASE_NAME_RENAME);
        try{
            String path = Constants.DATABASE_PATH+Constants.DATABSE_NAME;
            db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);



             File dbFile=myContext.getDatabasePath(Constants.DATABSE_NAME);

在下面的行中,它会抛出数据库锁定(代码5)。

            db.execSQL(String.format("ATTACH DATABASE '%s' AS BACKUP;",
                    dbFile,null));




          db.execSQL("INSERT INTO "+Constants.COMPANY_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.COMPANY_TABLE_NAME);
          db.execSQL("INSERT INTO "+Constants.PAGE_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.PAGE_TABLE_NAME);
          db.execSQL("INSERT INTO "+Constants.BOOKMARK_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.BOOKMARK_TABLE_NAME);
          db.execSQL("INSERT INTO "+Constants.CATALOG_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.CATALOG_TABLE_NAME);
          db.execSQL("INSERT INTO "+Constants.Order_Items_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.Order_Items_TABLE_NAME);
          db.execSQL("INSERT INTO "+Constants.Order_TABLE_NAME+" SELECT * FROM BACKUP."+Constants.Order_TABLE_NAME);

db.execSQL(String.format("DETACH DATABASE '%s' ;",
    "BACKUP",null));
db.close();       

        }catch(Exception e){




            Log.e("Db", e+"");
        }



    }

}

2 个答案:

答案 0 :(得分:0)

onCreate()(和RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/blog/$1 [L,R,NE] )在交易中运行;除了在该数据库中执行SQL语句之外,这些方法不能做任何事情。

如果您对旧数据库的内容不感兴趣,请不要更新它。只需为新数据库使用不同的文件名,并随时删除旧文件。

如果 对旧数据感兴趣,您可以在复制新文件后附加并复制它。

(并考虑使用SQLiteAssetHelper。)

答案 1 :(得分:0)

db.close();
不需要手动关闭数据库。