[Android SDK]无法从Assets复制外部数据库(13MB)

时间:2012-05-02 17:44:03

标签: android database large-files

我需要一个我正在开发的游戏的意大利语单词列表,但我实际上无法让它从资产中复制我的数据库。我尝试了很多我在网站上找到的解决方案,例如:

  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
  4. 但是我没有运气,它继续在线上给我this error

    os.write(buffer, 0, len);
    

    但我不明白为什么。这是我正在使用的function's codeconstants。 奇怪的是,我的数据库在11.45MB之后停止复制,距离目标只有1 MB。

    有人可以帮我解决这个问题吗?非常感谢:))

4 个答案:

答案 0 :(得分:4)

首先,默认资产文件夹支持db文件的最大大小为1mb。

您需要将数据库划分为多个部分。

Download HJSplit并将您的数据库分成小部分 比如13MB =每个1MB的13个部分。

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

答案 1 :(得分:4)

使用SQLiteAssetHelper,它有一个调试版本的数据库与应用程序逻辑,所以你不需要自己搞乱任何一个。

答案 2 :(得分: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();
}

答案 3 :(得分:1)

我知道这已经得到了解答,但我在创建测试时遇到了类似的问题,我希望在其中存储一个特定数据库,其中包含错误以测试错误数据。问题是资产中根本找不到测试数据库。甚至看到它我必须这样做:

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

忽略安全性,您可以看到它,然后获取输入流并将其保存到外部目录。