最後に私はNareshの助けを借りて結論を出しました(ありがとう)。ここでは短い要約:最初の実行時に 私は自分の1.6メガバイトのdata.dbファイルを資産から/data.../databasesフォルダにコピーしようとしていたことはありませんでした。だから、
OutputStream os = new FileOutputStream(destPath);
行がエラーを与えました。しかし、その行の後、私のdbhelperインスタンスはgetreadabledatabaseを呼び出し、指定されたパスの下にデータベースフォルダを作成しました。 Androidは同名のデータベースを置いていますが、有用なデータはありません。私のcopyDatabaseメソッドでは、次のように更新しました:
InputStream is = getBaseContext().getAssets().open(assetsDB);
//when there is no databases folder fileoutputstream gives error,
//we have to make sure databases folder exists
DbAdapter temp = new DbAdapter(getApplicationContext());
temp.open(); //gets readable database: creates databases folder containing DB_NAME db
temp.close(); //since we don use this temp, we close
//this wont give error: because path is now exists (databases folder exists)
OutputStream os = new FileOutputStream(destPath);
//copying 1K bytes at a time
byte[] buff = new byte[1024];
これは私が思いついた解決策です。ところで、以前のsdkの2.3資産データベースのサイズは1MB未満でなければなりません。これは、問題を解決するためのものであり、解決策が見つかりました。here
PRAGMA user_versionを実行すると、あなたのデータベースの資産を照会するあなたが得ている価値は何ですか?これが無効な値であれば、SqliteOpenHelperクラスはonCreateを呼び出して既存のものを削除して新しいものを作成します。いつコピーの前または後にSqliteOpenhelperを作成していますか? – Naresh
クイックリプレイのおかげで、PRAGMA user_versionは私に0を与えました。私はこれまで聞いたことがありません。このゼロをどうしたらいいですか? 私のアプリケーションでは、データベースをコピーした直後にSqliteOpenHelperを作成しています。 もしそうなら、どうしたらいいですか? なぜ次回の試行でテーブルが削除されないのですか? ところで、私のsqliteopenhelper onCreate、onUpgradeメソッドは空です。 –
いくつかのログを追加して、何らかの理由でデータベースを最初にコピーしたときにメソッドが呼び出されるかどうかを確認してください。その場合は、コピーしたコードをそこに置くこともできます。また、あなたは成功したコピーですか? – Naresh