2

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

  1. 在 Android 应用程序中使用您自己的 SQLite 数据库
  2. 如何将占用大量内存的大型数据库从资产文件夹复制到我的应用程序?
  3. 从 assets 文件夹加载大于 1M 的文件

但是我没有运气,它一直在给我这个错误就行了

os.write(buffer, 0, len);

但我不明白为什么。这是函数的代码和我正在使用的常量。一个奇怪的问题是我的数据库在 11.45MB 之后停止复制,距离目标只有 1MB。

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

4

4 回答 4

4

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

您需要将数据库分成几部分。

下载HJSplit并将您的数据库分成小部分,例如 13MB = 13 个部分,每个 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();
    }
于 2012-05-02T17:49:50.183 回答
4

Use SQLiteAssetHelper,它有一个调试版本的 package-the-database-with-the-app 逻辑,所以你不需要自己搞砸这些。

于 2012-05-02T17:57:11.817 回答
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();
}
于 2013-07-09T12:57:10.143 回答
1

我知道这已经得到解答,但是我在创建测试时遇到了类似的情况,我想在其中存储一个带有故障的特定数据库来测试错误的数据。问题是在资产中根本找不到测试数据库。为了看到它,我不得不这样做:

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

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

于 2012-07-24T17:03:43.033 回答