2

開発中のゲーム用にイタリア語の単語のリストが必要ですが、アセットからデータベースをコピーすることはできません。次のような、ウェブサイトで見つけたかなり多くの解決策を試しました。

  1. Android アプリケーションで独自の SQLite データベースを使用する
  2. 大量のメモリを占有する大規模なデータベースを assets フォルダーからアプリケーションにコピーする方法は?
  3. assets フォルダーから 1M を超えるファイルを読み込む

しかし、私は運がありませんでした.それは私にこのエラーを与え続けます

os.write(buffer, 0, len);

しかし、私はその理由を理解できません。関数のコードと使用している定数は次のとおりです。奇妙なことに、目標からわずか 1 MB 離れた 11.45 MB でデータベースのコピーが停止します。

誰かがこれを解決するのを手伝ってくれますか? どうもありがとう :)

4

4 に答える 4

4

package-the-database-with-the-app ロジックのデバッグ バージョンがある を使用SQLiteAssetHelperしてください。そのため、自分でこれをいじる必要はありません。

于 2012-05-02T17:57:11.817 に答える
4

まず、デフォルトでアセット フォルダがサポートする db ファイルの最大サイズは 1 MB です。

データベースを部分に分割する必要があります。

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();
    }
于 2012-05-02T17:49:50.183 に答える
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 に答える