2016-08-29 3 views
-1

업그레이드 방법에서 데이터베이스 이름을 바꾸고 assets 폴더에서 새 데이터베이스를 복사합니다.안드로이드 첨부 데이터베이스 onupgrade 잠금 데이터베이스

그러나 그것은 데이터베이스 잠금 (코드 5) expection가 발생합니다 아래 줄에 "데이터베이스 잠금 (코드) 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); 

에 예외를 throw 문을 부착하십시오.

  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

하지만 당신은 db connection을 닫은 다음 이름 바꾸기를 볼 수있다. –

답변

0

onUpgrade() (및 onCreate())는 트랜잭션 내에서 실행됩니다; 이러한 메서드는 해당 데이터베이스 내에서 SQL 문을 실행하는 것 외에는 아무 것도 수행하지 않아야합니다.

이전 데이터베이스의 내용에 관심이 없다면 업데이트하지 마십시오. 새 데이터베이스에 대해 다른 파일 이름을 사용하고 필요할 때마다 이전 파일을 삭제하십시오.

이 이전 데이터에 관심이 있다면입니다. 새 파일을 복사 한 후 첨부하고 복사 할 수 있습니다.

(그리고 SQLiteAssetHelper를 사용하는 것이 좋습니다.)

+0

사실 나는 모든 데이터를 저장해야한다. 데이터베이스가 갱신 될 때. –

+0

그런 다음 자산에서 새 DB를 복사하는 것이 의미가 없습니다. –

+0

먼저 이전 데이터베이스를 BACKUP 으로 이름을 바꾼 다음 자산 폴더에서 새 스키마를 복사하고 새 데이터베이스로 백업 데이터베이스를 연결하려고하므로 새 데이터베이스에 데이터를 복사하고 백업을 삭제할 수 있습니다. –

0

db.close를();
은 db를 수동으로 닫을 필요가 없습니다.

관련 문제