차근차근/Android

[안드로이드] APK 설치시 DB파일 포함

예쁜꽃이피었으면 2014. 12. 2. 11:16

http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=2374



몇개의 문서를 SQLite DB를 이용해서 화면에 보여주는 프로그램을 개발하고 있습니다.

해당 문서들의 내용을 DB에 저장한 후 에뮬레이터에서는 테스트 할 때 /data/data/[PackageName]/database 디렉토리에 DDMS를 이용해서 Push 한 후에 테스트 및 개발을 끝낸 후에, 모토로이를 사용해서 테스트를 할때 APK를 이용하여 설치 하거나, 이클립스의 Run 기능을 이용해서 기기에 Install 후 확인 하니 해당 DB파일이 포함 되지 않더군요.

위 파일을 APK내에 포함해서 쓸 순 없는지, 아니면 assets 디렉토리에 포함 시켜 DB파일을 로드 할 수 없는지 알고 싶습니다.

또, 위 작업이 불가능 하다면 프로그램 최초 실행시 Insert 쿼리를 사용해 DB파일을 신규 생성 해 줘야 하는지도 알려주시면 감사하곘습니다.


P.S. assets/database/ 폴더에 DB파일을 넣은 후 openOrCreateDatabase() 메소드를 사용 해서 
file:///android_asset/database/database.db
/android_asset/database/database.db
android_asset/database/database.db
등의 Filepath를 인자 값으로 줘도 파일을 인식 하지 못하더군요.




자답 입니다.

안드로이드펍의 개굴딱지님의 Q&A에서 도움을 얻어 해결 했습니다.

먼저 DB파일은 assests/databese/ 폴더에 추가 한 후

MainActivity.onCreate() 함수에서 아래와 같이 추가 해 줬습니다.


// DB파일 패키지 설치 폴더에 복사
File outfile = new File(
  "/data/data/[PackageName]/databases/Filename.db");

AssetManager assetManager = getResources().getAssets();
InputStream is = assetManager.open(
  "database/Filename.db",
  AssetManager.ACCESS_BUFFER);
long filesize = is.available();

// 패키지 폴더에 설치된 DB파일이 포함된 DB파일 보다 크기가 작을 경우 DB파일을 덮어 쓴다.
if(outfile.length() < filesize){
 byte[] tempdata = new byte[(int) filesize];
 is.read(tempdata);
 is.close();
 outfile.createNewFile();
 FileOutputStream fo = new FileOutputStream(outfile);
 fo.write(tempdata);
 fo.close();
}

AssetManger와 Stream을 사용 해 해당 파일을 비교 한 후 파일 사이즈가 패키지에 포함 된 파일 보다 작을 경우 덮어 쓰도록 처리 했습니다.



하루 종일 헤매던 부분인데 여기서 답을 찾았습니다. 귀중한 정보 감사합니다.
파일 사이즈가 1MB가 넘으면 assets 폴더의 파일이 컴파일시에 디바이스로 넘어가지가 있습니다.
또한 adb 명령어로 push하더라도 권한이 없다는 메세지만 나타납니다.
1MB이상의 DB파일들은 이 방법을 사용해야 할것 같습니다.


똑같이 했는데 왜 안돼죠??
먼저 DB파일은 assests/databese/ 폴더에 추가 한 후.......<왜 databese?? 오타나요?>
File outfile = new File(
  "/data/data/[PackageName]/databases/Filename.db"); ...........<또 여기에는 databases?? 헷갈리네여??>
InputStream is = assetManager.open( "database/Filename.db", ..............<여긴 또  database??? 3개 폴더명이 다틀리네요?? 그대로 해도 안돼고 폴더명 일치해서 해두 안되네요??>


처음 databese는 오타 네요...---> database

3개 폴더 다른게 아니고 두개 폴더 다름니다...


반응형