2016-08-29 51 views
-1

在升级方法我重命名我的数据库和从资产文件夹复制新的数据库。Android Attach数据库onupgrade锁数据库

但在附加声明它抛出的“数据库锁定(代码)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+""); 
     } 



    } 

} 
+1

请重新考虑你的方法 - 这在很多方面都被打破了。对于“资产数据库”问题,请考虑sqlite-asset-helper。 – laalto

+0

我想这就像每个系统....你不能重新命名文件,而它打开... – Opiatefuchs

+0

,但你看到我关闭数据库连接,然后重命名 –

回答

0

onUpgrade()(和onCreate())的一个事务中运行;除了在数据库中执行SQL语句之外,这些方法不能做任何事情。

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

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

(并考虑使用SQLiteAssetHelper)。

+0

其实我需要保存所有的数据数据库更新时。 –

+0

然后试图从资产中复制新的数据库没有意义。 –

+0

首先,我将我的旧数据库重命名为BACKUP ,然后从资产文件夹复制新模式并尝试将备份数据库附加到新数据库,以便我可以将数据复制到新数据库并删除备份 –

0

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