2012-05-02 1 views
2

개발중인 게임에 이탈리아어 단어 목록이 필요하지만 실제로 애셋에서 데이터베이스를 복사 할 수 없습니다. 나는 같은 나는 웹 사이트에서 찾을 솔루션의 quitea 많은 시도 :[Android SDK] 자산에서 외부 데이터베이스 (13MB)를 복사 할 수 없습니다.

  1. Using your own SQLite database in Android applications
  2. how to copy large database which occupies much memory from assets folder to my application?
  3. Load files bigger than 1M from assets folder

을하지만 운이 없었다, 그것은에 나에게 this error을주는 유지 line

os.write(buffer, 0, len); 

그러나 나는 이해할 수 없다. 왜? 사용중인 function's codeconstants은 다음과 같습니다. 이상한 점은 내 데이터베이스가 목표에서 1MB 떨어져있는 11.45MB 이후에 복사를 중지한다는 것입니다.

누군가가 해결할 수 있도록 도와 줄 수 있습니까? 많은 감사합니다 :)

+0

방문이 Q와 A : http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard –

+0

오류는 확인하지 않는다는 것입니다 'write'에서 사용하기 전에'len'을 사용하십시오. 'len'은 스트림의 끝에서'-1'이며 유효한 인덱스가 아닙니다. 다음 번에 스트림을 복사 할 때 @ gtumca-MAC 's while 루프를 사용하면 안전합니다. 어떤 문제가 있는지 물을 경우 – zapl

답변

4

우선 기본 자산 폴더에 의해 DB 파일의 최대 크기는 1MB의를 지원합니다.

데이터베이스를 여러 부분으로 나눠야합니다.

Download HJSplit 데이터베이스를 1MB의 13MB = 13 부분과 같이 작은 부분 으로 나눕니다.

demoDB.sqlitedb = 13메가바이트 는

demodb..sqlitedb.001 
demodb..sqlitedb.002 
demodb..sqlitedb.003 
demodb..sqlitedb.004 
... 
... 
demodb..sqlitedb.013 

그런 다음 데이터베이스를 병합하려면 다음 코드를 사용합니다. 당신이 자신의 엉망 할 필요가 없습니다, 패키지 - 더 - 데이터베이스와 - 더 - 응용 프로그램 논리의 디버그 버전이

private void copyDataBase() throws IOException { 
     AssetManager am = mContext.getAssets(); 
     OutputStream os = new FileOutputStream(DB_PATH + DB_NAME); 
     byte[] b = new byte[1024]; 
     String[] files = am.list(""); 
     Arrays.sort(files); 
     int r; 
     for (int i = 1; i <= 9; i++) { 
      InputStream is = am.open("demoDB.sqlitedb.00" + i); 
      while ((r = is.read(b)) != -1) { 
       os.write(b, 0, r); 
      } 
      Log.i("BABY_DATABASE_HELPER", "Copying the database (part " + i 
        + " of 9)"); 
      is.close(); 
     } 
     os.close(); 
    } 
+0

을 사용해보십시오 .... – MAC

+0

어떤 Android 2.3 시스템에도 적용되지 않는 어딘가에서 읽었습니다. t 분할,하지만 팁 주셔서 감사 :) :) – tiwiz

+0

하지만, 시장에서 사용할 수있는 대부분의 장치는 2.1 및 2.2 – MAC

1

나는이 답변에 대해 알고 있지만 잘못된 데이터를 테스트하기 위해 오류가있는 특정 데이터베이스를 저장하려는 테스트를 작성하는 동안 이와 같은 문제가 발생했습니다. 문제는 테스트 데이터베이스가 자산에서 전혀 발견되지 않았습니다. 심지어 그것을보고 나는이 작업을 수행했다 :

InputStream is = mContext.createPackageContext("com.activities.tests", Context.CONTEXT_IGNORE_SECURITY).getAssets().open("mydb.db"); 

을 당신이 그것을보고 다음의 InputStream을 외부 디렉토리에 저장할 수 있습니다 보안을 무시함으로써.

+0

좋은 전화, 가능한 한 빨리 테스트 해 보겠습니다. – tiwiz

2
private void copyDataBase() throws IOException { 
    AssetManager am = getAssets(); 
    OutputStream os = new FileOutputStream(DB_PATH + DB_NAME); 

    byte[] b = new byte[1024]; 
    String[] files = am.list(""); 
    Arrays.sort(files); 
    int r; 
    for (int i = 1; i <=21; i++) { 
     InputStream is; 

     if (i < 10){ 
      System.out.println("coping file demoDB.sqlitedb.00"+i); 
      is = am.open("demoDB.sqlitedb.00" + i); 
     }else{ 
      System.out.println("coping file demoDB.sqlitedb.0"+i); 
      is = am.open("demoDB.sqlitedb.0" + i); 
     } 
     while ((r = is.read(b)) != -1) { 
      os.write(b, 0, r); 
     } 
     is.close(); 
    } 
    os.close(); 
} 
관련 문제