'[개발정보]앱배포시 DB파일 함께 배포하는 방법'에 해당되는 글 1건

  1. 2010.05.04 [개발정보]앱배포시 DB파일 함께 배포하는 방법
04.Anddoid2010. 5. 4. 14:37
반응형
가끔 앱배포시에 DB파일을 함께 배포하는 방법을 문의하는 분들이 계셔서
제가 가지고 있는 정보를 공유하려고 합니다.
E-Book같은 것을 만들게 되면 DB도 함께 배포해야 합니다.

DB파일을 배포하는 방법에는 여러가지가 있겠지만(http://www.androidpub.com/7629 회색님 댓글 참조)
제가 공유하는 방법은 apk파일속에 넣어서 배포하는 방법입니다.

순서
1. 1MB가 넘는 DB파일은 900KB씩 잘라서 assets 폴더에 넣는다.
   (assets 폴더에 1MB이상 되는 파일을 넣고 읽으려면 에러가 발생합니다.)
2. 어플이 맨처음 실행될때 assets 폴더에 있는 DB파일을 순서대로 읽어서
   /data/data/패키지명/databases/DB파일명.db 로 하나의 DB파일을 만든다.

먼저 DB파일을 900KB씩 자르는 소스는

01.FileInputStream fis = new FileInputStream("경로/DB파일명.db");
02.BufferedInputStream bis  = new BufferedInputStream(fis);
03.          
04.FileOutputStream fos = fos = new FileOutputStream("경로/잘라진 DB파일명1.db");;
05.BufferedOutputStream bos = bos = new BufferedOutputStream(fos);;
06.          
07.byte[] b = new byte[1024];
08.int read = -1;
09.int count = 1;
10.int count2 = 1;
11.          
12.while((read = bis.read(b, 0, 1024)) != -1)
13.{            
14.    bos.write(b, 0, read);
15.    bos.flush();
16.              
17.    if(count2 % 900 == 0)
18.    {
19.        count++;
20.                  
21.        if(fos != null) fos.close();
22.        if(bos != null) bos.close();
23.                  
24.        fos = new FileOutputStream("경로/잘라진 DB파일명" + count + ".db");
25.        bos = new BufferedOutputStream(fos);
26.    }
27.              
28.    count2++;
29.}
30.          
31.fis.close();
32.bis.close();
33.if(fos != null) fos.close();
34.if(bos != null) bos.close();

위와 같이 900KB씩 자른 DB파일을 assets 폴더에 넣습니다.
그리고 어플이 맨처음 실행될때 아래와 같이 /data/data/패키지명/databases/생성될 DB명.db 로 만들어줍니다.

01.if(어플이 맨처음 실행이면)
02.{
03.    AssetManager am = null;
04.    InputStream[] arrIs = new InputStream[5]; // assets 폴더에 있는 DB파일 갯수 5개
05.    BufferedInputStream[] arrBis = new BufferedInputStream[5]; // assets 폴더에 있는 DB파일 갯수 5개
06.          
07.    FileOutputStream fos = null;    
08.    BufferedOutputStream bos = null;
09.          
10.    try
11.    {
12.        File f = new File("/data/data/패키지명/databases/생성될 DB명.db");
13.            
14.        // 혹시나 DB가 있으면 지우고 0바이트의 DB파일을 새로 만든다.
15.        if(f.exists())
16.        {
17.            f.delete();
18.            f.createNewFile();
19.        }
20.              
21.        am = this.getResources().getAssets();
22.             
23.        for(int i = 0; i < arrIs.length; i++)
24.        {
25.            arrIs[i] = am.open("assets 폴더에 있는 DB명" + (i + 1) + ".db");
26.            arrBis[i] = new BufferedInputStream(arrIs[i]);
27.        }
28.              
29.        fos = new FileOutputStream(f);
30.        bos = new BufferedOutputStream(fos);
31.              
32.        int read = -1;
33.        byte[] buffer = new byte[1024];
34.              
35.        for(int i = 0; i < arrIs.length; i++)
36.        {
37.            while((read = arrBis[i].read(buffer, 0, 1024)) != -1)
38.            {
39.                bos.write(buffer, 0, read);
40.            }
41.                  
42.            bos.flush();
43.        }
44.    }
45.    catch(Exception e){}
46.    finally
47.    {
48.        for(int i = 0; i < arrIs.length; i++)
49.        {
50.            try{if(arrIs[i] != null) arrIs[i].close();}catch(Exception e){}
51.            try{if(arrBis[i] != null) arrBis[i].close();}catch(Exception e){}
52.        }
53.              
54.        try{if(fos != null) fos.close();}catch(Exception e){}
55.        try{if(bos != null) bos.close();}catch(Exception e){}
56.              
57.        arrIs = null;
58.        arrBis = null;
59.    }
60.}

이상입니다.
그리고 assets 폴더에 있는 파일을 삭제하려고
여기저기 알아봤는데 결국에는 못찾았습니다.
불가능하다는 답변만......
불가능하지 않은 방법을 아시는 분은 말씀해주시면 감사드리겠습니다.

약 1년전쯤 SDK 1.0에서 만든 소스인데 2.0에서도 잘 돌아가고
모토로이에서도 잘 돌아가네요..^^


출처 : http://www.androidpub.com/?mid=android_dev_info&category=108970&document_srl=191797
Posted by 1010