전체 예제 코드를 http://bunhere.tistory.com/205 에 추가했습니다.
약간 복잡한 기초 데이터를 위해 초기 실행시 Create Table 도 하고 insert도 할 수 있겠지만, 별도의 db 파일을 만들어 관리하고 싶다면 아래와 같은 방법을 쓰는 것도 한가지 방법입니다.


1. db 파일을 assets에 넣습니다.


 2. 아래 함수를 적당한 위치에 넣습니다.
풀 코드가 아니라 크게 도움은 안되지만 컨셉을 이해하실 수 있을 것이라고 생각됩니다.ROOT_DIR은 아래와 같이 선언되어 있습니다. 경로는 자기 패키지 경로로 수정해주시면 됩니다.

[2010-09-30] 간단히 설명 추가합니다.
4번 라인에서 mkdirs를 통해 폴더를 생성하고자 노력합니다. 일단 만들어져있으면 이 함수를 실패할 것입니다.
그러나 이미 원하는 목적(폴더생성)은 되어 있을 것이므로 문제가 되지 않습니다.
중요한 점 하나는 /data/data/ 아래에는 자기 패키지가 있는 곳 외에는 수정이 불가능합니다.
따라서 ROOT_DIR이 이상할 경우 mkdirs는 폴더가 없더라도 실패합니다.

5번라인에서 해당 폴더 아래 DATABASE_NAME 변수가 가르키는 이름을 가진 파일이 있는지 체크합니다.
이 파일의 이름은 반드시 assets에 복사해놓은 파일명과 동일해야 합니다.
(테이블 명이 아닙니다!)
왜냐하면 9번 라인에서 assetManager를 오픈할 때 이 DATABASE_NAME을 쓰기 때문입니다.



DATABASE_NAME은 assets에 복사해놓은 파일명(첫번째 그림 참조)입니다 이 경우 lecture.db가 되겠네요.저는 폴더를 따로 만들었습니다. 이를 위해 먼저 3,4번 라인에서 패키지 경로 밑에 database란 폴더를 생성합니다.mkdirs는 이미 폴더가 있으면 실패하게 됩니다.
5번 라인에서 파일을 읽어드립니다.
6번 라인과 같이 파일의 길이가 0보다 작다는 것은 파일이 없다는 의미라고 생각했습니다. 따라서 파일을 복사하는 그 아래 코드(7번~18번)를 실행하게 됩니다.asset의 파일을 읽어오기 위해 7번 라인과 같이 assetManager를 이용해서 파일을 오픈합니다.나머지 내용들은 자바이므로 생략합니다.혹시 이해가 안되는 부분이나 더 나은 방법이 있다면 답글 주세요.


허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.



  1. 김선운 2010.07.03 04:15 신고

    기존에 있는 data.sqlite를 assets에 넣고, 올려주신 소스를 이용해 갤럭시 S에서 db를 읽어오는 어플리케이션을 테스트하고있는데요, db를 받아오려고 하는데 받아지지가 않습니다. NULL로 들어오네요.. db가 생성되었는지 확인도 되지 않구요.. 좋은 방법 없을까요?

    • 소혼 2010.07.03 06:54 신고

      제 코드 중에 에러가 나나요? 어떤 부분이 NULL로 나오는지 정확히 알면 도움이 될 수 있을 것 같네요. 정확한 에러 메시지 올려주실 수 있을까요?
      DB 생성에 대한 확인은 전 리눅스 머신에서 sqlite를 실행해서 확인했습니다만, 윈도우에서는 sqlite를 쓰기 좀 번거롭죠. 만약, DB 생성 자체를 확인하려면 DDMS를 통해 파일을 넣어서 정상 동작하는지 확인해봐야겠네요. DB 파일을 DDMS에 넣는 방법이랑 DB 사용 예제도 한번 올려볼께요. 결혼식 때문에 지방에 가야 해서 내일이나 가능할듯 합니다 ^^;

  2. 김선운 2010.07.08 10:03 신고

    늦게 봐서 죄송합니다. 여태 고생하고있네요.
    혼자 해결할 수 있을거라 장담하고, 몇번 시도해봤는데,
    결과는 마찬가지네요.
    try/catch를 이용하여 먼저 확인을 하고있는데요.
    우선 copy에서 어플리케이션이 잠시 멈추는걸 보아
    복사를 하는 것 같긴 한데,
    복사된 db에 접근하여, Open하거나 테이블을 불러오는데에서
    catch에 걸립니다.. data폴더를 열어볼 수도없어
    확인이 안되는데 어떻게 하면 좋을까요?

    • 소혼 2010.07.08 19:55 신고

      답변이 늦어 죄송합니다. 낮시간에는 블로그를 쓸 수 없어서요;
      아무래도 코드나 에러를 보지 않고는 도움을 드리기 어려울 것 같습니다. 웬지 DB 파일에 문제가 있을 것도 같구요.
      복사가 되었는지 확인은 DDMS를 통해서 할 수 있습니다.

    • 소혼 2010.07.08 23:57 신고

      http://bunhere.tistory.com/163 글 한번 보세요.
      SDK로 디비 파일 안에 확인하는 방법 적었습니다.

    • 가디 2010.07.22 14:07 신고

      갤럭시 S에서는 /data 폴더 밑으로 전부 Permission이 막혀있더라고요.
      그래서 그런듯 한데요.

  3. 소혼 2010.07.22 23:45 신고

    갤럭시S에서도 위 코드 동작합니다. /data 밑은 Permission이 없지만 각 패키지 아래 폴더 위치는 쓸 수 있습니다.

  4. 치즈마루 2010.08.15 15:59 신고

    안녕하세요??
    프로그램에 BD파일을 넣어 apk 파일로 만들고 싶은데...
    public static void initialize(Context ctx) 만약 main.java에서 이 함수를 쓰는데
    Context ctx를 메인자바에서 어떻게 넘겨줘야 하는건가요?;;
    ㅠㅠ

    • 소혼 2010.08.15 20:47 신고

      일단 Activity나 Service, ContentProvider같은 것으로부터 시작하셨다면 Context를 최소 한개는 만드셨을 거에요. 만드신 Activity가 바로 Context입니다. Activity의 this를 넘겨주시면 될 것입니다.

  5. 유진 2010.09.25 19:06 신고

    음... public static final String ROOT_DIR = "/data/data/dd.a/";
    public static void initialize(Context ctx) {
    // check
    File folder = new File(ROOT_DIR + "databases");
    folder.mkdirs();
    File outfile = new File(ROOT_DIR + "databases/" + "chosung.db");
    if (outfile.length() <= 0) {
    AssetManager assetManager = ctx.getResources().getAssets();
    try {
    InputStream is = assetManager.open("chosung.db", 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();
    }}
    }
    이렇게 해보았는데 폴더도 안생기고 안만들어죠요 ㅠ

  6. 유진 2010.09.26 23:37 신고

    네... 테스트 해본다고 패키지명을 대충 해봐서 ...

    • 소혼 2010.09.28 00:44 신고

      이상하네요. 특별히 잘못된 부분은 안보이는데 initialize가 호출되는지 Log를 찍어보시는 것도 좋을 것 같네요. databases 폴더도 안생기나요? 패키지 명이 맞고 folder.mkdirs를 정상적으로 호출하면 databases 폴더가 생겨야 합니다;;

  7. 오지훈 2010.09.27 15:12 신고

    팁 정말정말 감사드립니다!!^^
    안드로이드 초짜 개발자인데요;
    위와같은 방식으로 기존 디비를 끌어온 다음에
    안드로이드 기본 디비 접근 방식을 이용하여
    데이터들을 활용해야 하는지 구체적인 방법을 잘 몰라서요ㅠ
    SQLiteOpenHelper를 이용해서 열어야 하는지
    혹은 다른 방법을 이용해야 하는지 궁금합니다ㅠ

    • 소혼 2010.09.28 00:42 신고

      SQLiteOpenHelper를 사용하긴 어려울 수도 있을것 같네요.
      일단 저는 SQLDatabase를 직접 호출해서 쓰고 있습니다.
      http://bunhere.tistory.com/140 를 보셔도 도움이 될 것같네요.
      그 글에서 createDB를 안한다고 생각하시면 됩니다.

+ Recent posts

티스토리 툴바