2014-01-16 5 views
2

sdcard에 내 애플리케이션 데이터베이스를 백업하고 나중에 가져오고 싶습니다. .sqlite db는 ORMLite에 의해 관리됩니다. 나는 대답 https://stackoverflow.com/a/20143148/335105을 읽었지만 그 접근법을 따르면 수출 후에 생성 된 현재 DB의 모든 데이터가 지워질 것입니다.백업/복원 Android App DB ORMLite에서 관리

내 데이터베이스를 sdcard로 내보내고 나중에 이미 포함 된 데이터를 손실하지 않고 가져올 수있는 방법이 있습니까? 제안?

+1

기존 응용 프로그램보다 수동 가져 오기/내보내기 시스템을 개발해야했지만 그게 꽤 아니 었습니다 ... 한숨 !!! –

답변

1

데이터 모델이 나중에 변경되지 않는다는 것을 알고 있으면 데이터베이스를 "벙어리"로 내보낼 수 있습니다. DB는 파일로 저장됩니다.

public static final String CURRENT_DATABASE_PATH = "data/data/" + App.getContext().getPackageName() + "/databases/" + DatabaseHelper.DATABASE_NAME 

여기서 DATABASE_NAME은 DB 생성시 사용되는 이름입니다. 다시

public static void exportDB() { 
    try { 
     File dbFile = new File(CURRENT_DATABASE_PATH); 
     FileInputStream fis = new FileInputStream(dbFile); 
     getExportDirectory(); 
     String outFileName = createExportName(); 
     OutputStream output = new FileOutputStream(outFileName); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = fis.read(buffer)) > 0) { 
      output.write(buffer, 0, length); 
     } 
     output.flush(); 
     output.close(); 
     fis.close(); 
    } catch (Exception e) { 
     App.log(e); 
    } 
} 

그리고위한 : 여기

는 수출 (나는,이 코드가 강하게 나는 지금 찾을 수없는 다른 유래 스레드에 의해 inspirated하는 저자 아니에요) 내가 사용하는 방법이 있습니다 이 방법은 작동하지 않을 것입니다 데이터 모델을 업데이트하려면 당신은 아마/내보내기를 수동으로 실시 당신이 원하는 모든 것을 가져해야합니다, 그래서, 그러나

public static boolean importDB(String dbPath) { 
     try { 
      AppStorage.get().close(); 
      File newDb = new File(dbPath); 
      File oldDb = new File(CURRENT_DATABASE_PATH); 
      if (newDb.exists()) { 
       copyFile(new FileInputStream(newDb), new FileOutputStream(oldDb)); 
       AppStorage.get().getWritableDatabase().close(); 
      } 
      AppStorage.reset(); 
      return true; 
     } catch (Exception e) { 
      App.log(e); 
     } 
     return false; 
    } 

를 가져옵니다.

편집 : AppStorage는 내 사용자 정의 db 래퍼입니다. 이 방법은 데이터베이스를 삭제하지 않습니다.

+0

App.getContext()에서 App이란 무엇입니까? getPackageName() ??? – KJEjava48

+0

이 경우 응용 프로그램은 응용 프로그램 프레임 워크 클래스를 확장하는 클래스입니다. App 클래스의 일반 컨텍스트에 대한 정적 참조를 유지하므로 항상 응용 프로그램에서 사용할 수 있습니다 (getContext() 메서드로 액세스 가능). – vanomart