2013-06-24 3 views
0

애셋 폴더에 sqlite db가 있습니다. 앱을 처음 실행하기 위해 "data/data/databases"경로로 복사합니다.Android : 진저 브레드 전에 애셋에서 sqlite 복사

진저 브레드에서 모든 장치에서 정상적으로 작동하지만 이전 버전에서는 데이터베이스를 쿼리 할 때 테이블을 찾을 수없는 예외가 발생합니다. 실제로 데이터베이스 폴더에있는 db는 비어 있습니다. android_metadata 테이블 만 포함합니다. 여기

내가 DB를 복사하는 데 사용하는 두 가지 방법 : 여기

public static void copyDBInMemoryIfNeeded(Context ctx, String pkgName) { 
    try { 
     String destPath = ctx.getFilesDir().getParentFile().getPath() + "/databases"; 
     File f = new File(destPath); 
     if (!f.exists()) { 
      f.mkdirs(); 
      f.createNewFile(); 
      copyDBInMemory(ctx.getAssets().open("mydb.sqlite"), 
        new FileOutputStream(destPath)); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private static void copyDBInMemory(InputStream inputStream, OutputStream outputStream) 
     throws IOException { 
    // ---copy 1K bytes at a time--- 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = inputStream.read(buffer)) > 0) { 
     outputStream.write(buffer, 0, length); 
    } 
    inputStream.close(); 
    outputStream.close(); 
} 

및 내 DBAdapter 클래스 :

public class DBAdapter {  

final Context context; 
DatabaseHelper DBHelper; 
SQLiteDatabase db; 

public DBAdapter(Context ctx) { 
    this.context = ctx; 
    DBHelper= new DatabaseHelper(context); 
} 

private static class DatabaseHelper extends SQLiteOpenHelper { 

    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion 
       + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS contacts"); 
     onCreate(db); 
    } 
} 

public DBAdapter open() throws SQLException { 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    DBHelper.close(); 
}                        } 
+0

SQL Server 자산 폴더의 크기는 얼마나됩니까? – hardartcore

+0

4.7 메가 바이트 – TheModularMind

답변

0

데이터베이스를 HJSplit으로 분할하지 않고 자산 폴더에 배치하는 작업이 종료되었습니다. 그런 다음 "data/data/databases"에있는 db를 다음과 같이 복사합니다.

private static void copyDataBase(Context ctx, FileOutputStream os) throws IOException { 
    AssetManager am = ctx.getAssets(); 
    byte[] b = new byte[1024]; 
    int r; 
    for (int i = 1; i <= 5; i++) { 
     InputStream is = am.open("mydb.sqlite.00" + i); 
     while ((r = is.read(b)) != -1) { 
      os.write(b, 0, r); 
     } 
     is.close(); 
    } 
    os.close(); 
} 
1
안드로이드 2.2에서

아래 당신이 SQLite는 사용하는 동안 고려해야 할 것이 있습니다 자산 폴더에있는 파일 1MB보다 큰 파일은 앱의 개인 데이터베이스 폴더에 복사 할 수 없습니다. 이것이 버그인지 또는 다른 것인지 확실하지 않지만 데이터베이스를 사용하려는 경우 데이터베이스 도우미에서 전체 데이터베이스 스키마를 만들 수 있습니다.

해결 방법 :이 좋은 옵션이지만, 단지 .sqlite, .db 또는 파일의 이름과 데이터베이스 확장의 모든 종류를 제거 12메가바이트의 SQLite 데이터베이스 내 상황에서 작동하고 트릭을해야 할 경우 확실하지.

+0

감사합니다. 귀하의 해결 방법을 시도했지만 불행히도 그것은 나를 위해 작동하지 않습니다 ... 나는 다른 파일에 내 DB를 분할하고 자산 폴더에 넣어하려고합니다. – TheModularMind

+0

원하는 경우 다른 파일 확장자를 넣으십시오. 한 번 .mp3을 사용하려고했는데 제대로 작동했습니다. – hardartcore

관련 문제