마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

assets 기존에 만든 DB를 복사해서 사용할때

0 추천

DB파일 1MB가 되지 않습니다.

DB파일을 assets에 저장후 data/data/패키지명/databases에 복사하여 사용 하는데요

복사까지는 되는데 그안에 Table이 분실되어 no such table이 뜨네요;;

DDMS에서 확인시  data/data/패키지명/databases 에 TimeTable.db 파일과  TimeTable.db-journal 파일이 두개 생성이 되며

DDMS에서  TimeTable.db 파일 추출해서 확인하면 기존에 있던 테이블은 다 분실이 되고

android-meatadata라는 테이블만 남아있네요;;

무엇이 문제일까요

참고로 DB파일을 곧바로 DDMS에서 추가해놓으면 데이터는 읽어옵니다.(정상작동)

제가 궁금한것은 assets에 있는 db를 DDMS(data/data/패키지명/databases)에 복사할 때

왜 기존에 있는 Table들이 다 없어지는지 궁금합니다.

 

	public static final String PACKAGE_DIR = "/data/data/app.smtit_yd/";
	public static final String DATABASE_NAME = "TimeTable.db";
	public static final String COPYDATA_NAME = "TimeTable.db";
	
	public static void initalize(Context ctx) {
		// check
		File folder = new File(PACKAGE_DIR + "databases");
		if (folder.exists()){

			
		} else {
			folder.mkdir();
		}
		
		File outfile = new File(PACKAGE_DIR + "databases/" + COPYDATA_NAME);

		if (outfile.length() <= 0) {
			AssetManager assetManager = ctx.getResources().getAssets();
			try {
				InputStream is = assetManager.open(DATABASE_NAME, AssetManager.ACCESS_BUFFER);
				long filesize = is.available();
				byte [] tempdata = new byte[(int)filesize];
				is.read();
				is.close();
				outfile.createNewFile();
				FileOutputStream fo = new FileOutputStream(outfile);
				fo.write(tempdata);
				fo.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 

개님개님 (520 포인트) 님이 2015년 2월 15일 질문
개님개님님이 2015년 2월 16일 수정
아마 다른 문제 일겁니다. 같은 아이디어의 라이브러리를 쓰는데, 잘 로드됩니다.
이상하게 저는 테이블이 다 날아가버리네요;; 무엇이 문제인지 답답하네요

2개의 답변

+1 추천
 
채택된 답변
복사한 파일과 assets에 들어있는 파일이 동일한지 비교해보세요.

조금이라도 다르면 복사를 잘못한 겁니다.
익명사용자 님이 2015년 2월 16일 답변
개님개님님이 2015년 2월 16일 채택됨
파일은 동일합니다. assets에 넣은 db 파일을 main_activity에서 코드로 복사해오면 테이블이 날아가고 db를 바로 DDMS에서 import하면 정상 작동하네요; 문제가 뭔지 모르겠습니다
코드로 복사한 파일이 실제로는 복사된것이 아니라 새로 생성된 것일수도 있겠다는 생각이 드는군요.
import로 잘 된다는건 DB원본이 문제가 아니라는 것이니까요.
외장 SD카드 부분에 복사를 해보시고 생성된 DB의 용량을 확인해보세요
외장SD카드 부분이라는것이 (현재 쓰는 핸드폰이 외장 SD카드가 아예 없는 기종이라서요.. htc one m7 사용중입니다.)
흠.. 복사하는 코드의 문제인가보네요 다시 한번 확인 해봐야겠습니다
복사 코드의 문제 였던것 같습니다. 코드 다시 수정하고 나니 돌아가네요 ㅠ
답변달아주신 분들 감사합니다.
0 추천
asset에 있는 db파일을 그대로 복사해서 사용하면 되는지 안되는지는 잘 모르겠군요

저같은 경우엔 SQLiteOpenHelper를 사용해서 내부적으로 쓰는 db 파일은 새로 생성하고

앱 시작시 (최초 1회) asset에 있는 db 파일을  읽어서 row를 새로생성한 db에 쓰는 방식으로 했었습니다
Gradler (109,780 포인트) 님이 2015년 2월 16일 답변
아 이런 방법도 있군요.. 근데 제가 찾아본결과로는 assets의 파일을 직접 읽어서 참조하는 것이 안되서 복사를 하는것으로 알고 있었거든요 ㅠ
...