2011-08-02 3 views
2

私は内部データベースへのコピーが必要なアセットにデータベース(1.69 MB)があります。私の問題は、最初のtry dbはコピーされますが、正確なテーブルはコピーされません。エミュレータファイルエクスプローラで3072(3kB)サイズになります。アセット内のデータベースをAndroidの内部データベースにコピーしようとすると、エミュレータで最初にエラーが発生します。

私はsqliteエクスプローラでそのデータベースを見ると、私のテーブルを見ることができません。 dbに存在する唯一のテーブルは、私のロケール情報の1つのカラムを持つandroid_metadataテーブルです。

しかし、データベースからそのデータベースをクリアしてアプリケーションを再実行すると、この時点で動作しているようです。なぜ最初の試行で失敗するのですか?どのように私はそれが実際のデバイスで発生しないことを確認することができますか? これはエミュレータのバグですか?

+0

PRAGMA user_versionを実行すると、あなたのデータベースの資産を照会するあなたが得ている価値は何ですか?これが無効な値であれば、SqliteOpenHelperクラスはonCreateを呼び出して既存のものを削除して新しいものを作成します。いつコピーの前または後にSqliteOpenhelperを作成していますか? – Naresh

+0

クイックリプレイのおかげで、PRAGMA user_versionは私に0を与えました。私はこれまで聞いたことがありません。このゼロをどうしたらいいですか? 私のアプリケーションでは、データベースをコピーした直後にSqliteOpenHelperを作成しています。 もしそうなら、どうしたらいいですか? なぜ次回の試行でテーブルが削除されないのですか? ところで、私のsqliteopenhelper onCreate、onUpgradeメソッドは空です。 –

+0

いくつかのログを追加して、何らかの理由でデータベースを最初にコピーしたときにメソッドが呼び出されるかどうかを確認してください。その場合は、コピーしたコードをそこに置くこともできます。また、あなたは成功したコピーですか? – Naresh

答えて

3

最後に私は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

関連する問題