제임스딘딘의
Tech & Life

개발자의 기록 노트/Android

[안드로이드] 이미 생성해둔(Sqlite) DB를 앱에서 Load하여 사용하기

제임스-딘딘 2011. 8. 11. 00:27

이미 생성해둔(Sqlite) DB파일을 앱에서 읽어들여 사용하기



약간 복잡한 기초 데이터를 위해 초기 실행시 Create Table 도 하고 insert도 할 수 있겠지만, 별도의 db 파일을 PC등에서 미리 만들고, 관리하며, 앱에서는 이 파일을 읽어들이기만 하여 (Load) 사용하고 싶다면 아래와 같은 방법을 쓰는 것도 한가지 해결책이 될 수 있다.

  1. db 파일을 assets에 넣는다.
  2. 아래 함수를 적당한 위치에 넣는다.


public static void initialize(Context ctx) {
	// check 
	File folder = new File(ROOT_DIR + "databases");
	folder.mkdirs();
	File outfile = new File(ROOT_DIR + "databases/" + DATABASE_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(tempdata); 
			is.close();
			
			outfile.createNewFile();
			FileOutputStream fo = new FileOutputStream(outfile);
			fo.write(tempdata);
			fo.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


완전한 코드는 아닌지라, copy & paste로 당장 본인의 앱에 적용을 하는건 불가능 할 수 있다. 하지만 '컨셉'을 이해하는 데는 도움이 될 것이라고 생각한다.

ROOT_DIR은 아래와 같이 선언되어 있다. 경로는 자신의 앱 패키지 경로로 수정하면 된다.

public static final String ROOT_DIR = "/data/data/com.gurucat.test/";


DATABASE_NAME은 assets에 복사해놓은 파일명이다. 이 경우 lecture.db가 되될것이다. 

내 경우에는 폴더를 따로 만들었다. 이를 위해 먼저 3,4번 라인에서 패키지 경로 밑에 database란 폴더를 생성합니다. mkdirs( ) 메서드는 이미 폴더가 존재한다면 실패한다.
5번 라인에서 파일을 읽어들인다.
6번 라인과 같이 파일의 길이가 0보다 작다는 것은 파일이 없다는 의미라고 가정한다. 따라서 파일을 복사하는 그 아래의 코드를 실행하게된다.
asset의 파일을 읽어오기 위해 7번 라인과 같이 assetManager를 이용해서 파일을 오픈한다.
나머지 내용들은 단순한 Java File I/O 코드이므로 더이상의 설명은 생략한다.


1MB 이상의 Database file을 asset에 넣을 때 몇가지 기억할 점

asset 폴더에 단일 파일의 크기가 1MB가 넘으면 안된다.
만약 1MB이상의 DB파일을 위와 같은 방법에 적용해야 한다면??

1MB 이상의 db 파일을, 여러개로 분할해서, assets 디렉토리에 넣어서 패키징하고, 배포한 후에, 런타임 시에 SD 카드로 복사하면서 파일을 합치면 된다.

근데 이런 식으로 하게되면 생기는 문제가 apk 파일 크기가 커지는 것이다. 이렇게 되면 사용자들로부터 '앱 용량이 크다'는 불만을 유발 할 수 있다. 이때는 큰 용량의 db 파일은 밖으로 빼서, 런타임시 인터넷에서 다운로드하여 SD 카드에 저장하는 방식을 적용하면 apk파일 크기가 커지는 문제를 회피할 수 있다. 이렇게 하려면, 웹서버가 있어야 하겠지만, 구글 프로젝트 호스팅이라는 서비스를 이용하면, 웹서버 없이도 다운로드 호스팅을 해결할 수 있을 것이다.