2012-05-02 56 views
2

我需要一個意大利語詞彙列表,用於正在開發的遊戲,但我實際上無法使其從資產中複製我的數據庫。我試圖quitea很多解決方案,我的網站上找到,如:[Android SDK]無法從Assets中複製外部數據庫(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上線

os.write(buffer, 0, len); 

但我不能說服d爲什麼。這裏是我使用的function's codeconstants。 奇怪的是,我的數據庫在11.45MB後停止複製,距離目標只有1 MB。

有人可以幫我解決這個問題嗎?非常感謝:)

+0

訪問這個Q和A:http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard –

+0

錯誤是你不檢查'len',然後在'write'中使用它。 'len'在流末尾是'-1',這不是有效的索引。使用@ gtumca-MAC的while循環下一次你複製流,你很安全 – zapl

回答

4

使用SQLiteAssetHelper,它具有包的數據庫,用最應用程序邏輯的調試版本,所以你不需要招惹任何這種自己。

+0

非常感謝您的提示,現在就試試吧:)再次感謝:) – tiwiz

4

首先,默認資產文件夾支持db文件的最大大小爲1mb。

你需要將你的數據庫分成幾部分。

Download HJSplit並將您的數據庫分成小部分 ,如13MB = 13MB各1MB。

demoDB.sqlitedb = 13MB 然後

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(); 
}