달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
728x90
반응형
안드로이드 - assets 폴더에서 DB 복사하기.
실제 단말기에서 App을 돌리면, 에뮬에서 작업한 db가 생성되지 않는다.
이클립스로는 갤럭시s에서는 /sdcard 제외한 내부 파일시스템에는 접근할 수도 없다.



그럼 애써 작업한 db 파일을 못쓴다는것인가?

찾아본 방법중 하나는,
이클립스에서 빌드하기전에, assets 이란 폴더에 해당 db 파일을 카피해서 넣고,
빌드후 어플리케이션내에서 해당 패키지 폴더 명으로 db 파일을 카피를 하는 방법이 있었다.

첫번째 방법은 뻑나기 좋으므로,
두번째 방법은 웹에서 db를 다운로드 받아서 해당 패키지에 db를 카피하는것이 가장 좋을듯하다.
상용되는 대부분의 App들이 웹으로부터 db 파일을 받아서 업데이트가 이루어 질것이다.

수많은 데이터를 parsing 받아 db에 저장하는 식은 아무리 초고속 인터넷이라도
엄청난 시간이 소요될것이니까...

물론 위 두 방법다 자바 입출력 메소드를 통해 이루어진다.


늘 써오던 자바 입출력 메소들를 써서, 파일을 불러들이고, 다시 쓰면 된다.
단, assets 에 있는 파일명과 일치 해야된다.
private void copydb(Activity act) {
 
		AssetManager am = act.getAssets();
		File f = new File("/data/data/com.ludvan/databases/parking.db");
 
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
 
		try {
 
			InputStream is = am.open("parking.db");
			BufferedInputStream bis = new BufferedInputStream(is);
 
			// 만약에 파일이 있다면 지우고 다시 생성
			if (f.exists()) {
				f.delete();
				f.createNewFile();
			}
			fos = new FileOutputStream(f);
			bos = new BufferedOutputStream(fos);
 
			int read = -1;
			byte[] buffer = new byte[1024];
			while ((read = bis.read(buffer, 0, 1024)) != -1) {
				bos.write(buffer, 0, read);
			}
			bos.flush();
 
			fos.close();
			bos.close();
			is.close();
			bis.close();
 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
이것때문에 반나절 삽질한것 같다...

만약에 db 파일이 1MB 이상이면, 조건에 걸려서 카피가 되지 않는다.
이럴땐, 파일을 조각내서 카피하면 되는데 방법은 아래의 URL 참고.

http://www.androidpub.com/191797

http://hyeongkyu.net/110090943249

http://nashorn.tistory.com/category/?page=8
728x90
반응형
:
Posted by mapagilove