AndroidのSQLiteデータベースにも同様の問題がありました。私はずっと前にhttps://code.google.com/p/android/issues/detail?id=174566にバグレポートを提出しました。この報告書では、その理由についての私の調査結果について詳しく説明します。あなたの問題に関連しているかどうかはわかりませんが、いくつかの特徴を共有しているようです。
ここで要約すると、Androidはデータベースファイルを開き、onUpgrade()を呼び出し、onUpgrade()呼び出し中にデータベースファイルを置き換えると、Android側のファイルハンドルが古いファイルを指し示し、 onUpgrade()から戻ってAndroidが古いファイルにアクセスしようとするとアプリケーションがクラッシュする可能性があります。ここで
は、私は、問題を回避するために使用されるいくつかのコードです:
アプリを起動すると、私は(のonCreateでこれをやった):
Thread t = new Thread(new Runnable() {
@Override
public void run() {
Context context = getApplicationContext();
DBReader.copyDB(MainActivity.this);
DBReader.initialize(context);
}
});
t.start();
これは、データベースファイルの更新が発生する原因となりますバックグラウンドでアプリが起動している間に、ユーザーはすばらしいアプリケーションに畏敬の念を抱いています。私のファイルはかなり大きかったので、コピーにはしばらく時間がかかりました。ここでonUpgrade()で何もしないように注意してください。
DBReaderが関心の主なコードはこれであるために私自身のクラス、次のとおりです、話を短くするために、そう
public static synchronized boolean checkIfInitialized(Context context) {
File dbFile = context.getDatabasePath(DBHelper.DB_NAME);
return dbFile.exists();
}
:
SharedPreferences prefs = context.getSharedPreferences(Const.KEY_PREFERENCES, Context.MODE_PRIVATE);
//here we have stored the latest version of DB copied
String dbVersion = prefs.getString(Const.KEY_DB_VERSION, "0");
int dbv = Integer.parseInt(dbVersion);
if (checkIfInitialized(context) && dbv == DBHelper.DB_VERSION) {
return;
}
File target = context.getDatabasePath(DBHelper.DB_NAME);
String path = target.getAbsolutePath();
//Log.d("Awesome APP", "Copying database to " + path);
path = path.substring(0, path.lastIndexOf("/"));
File targetDir = new File(path);
targetDir.mkdirs();
//Copy the database from assets
InputStream mInput = context.getAssets().open(DBHelper.DB_NAME);
OutputStream mOutput = new FileOutputStream(target.getAbsolutePath());
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer)) > 0) {
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
SharedPreferences.Editor edit = prefs.edit();
edit.putString(Const.KEY_DB_VERSION, "" + DBHelper.DB_VERSION);
edit.apply();
とcheckIfInitializedためのコード()私はonUpgrade()を完全に避け、独自のカスタムアップグレード機能を実装しました。これにより、onUpgrade()のデータベースが変更されたため、古いファイルハンドルや無効なファイルハンドルでAndroid OSがクラッシュする問題を回避できます。
実際にデータベースをアップグレードできるようにする関数でデータベースファイルをアップグレードすると、OSがアプリケーションをクラッシュさせる原因となるonUpgrade()が奇妙になります。そして、バグレポートに関するGoogleのコメントは数年後に作られたので、私はもはやコンセプトを簡単に証明するために元のクラッシュコードがなくなった。
データベースファイルをコピーしていないにもかかわらず、問題が多少異なる可能性がありますが、依然として問題が修正されているように見えるため、根本原因が似ている可能性があります。
なぜすべてのデータベースを削除しますか? – USKMobility
あらかじめ構築されたデータをたくさん送ろうと思います。 – suku