データベースのバックアップと復元をアプリケーションに組み込んでいます。これはすべて正常に動作しますが、データベースの復元時には、シングルトンDBHelperの使用と、アプリケーションの終了時にデータベースを閉じるだけで、データベースのメモリ内コピーが復元後も引き続き使用されるためです。データベースヘルパーにシングルトンを使用しているときに、リストア後にSQLiteデータベースをリフレッシュ/再オープンする方法
アプリケーションを終了して再起動すると、新しいデータベースが使用されます。ただし、これを行うようにユーザーに指示するのではありません。私は復元されたデータベースにシームレスにアクセスしたいと思います。
これが検出され、その後、復元に成功すると報告したコードである: -
if(copytaken && origdeleted && restoredone) {
errlist.add("Database successfully restored." +
"\n\nYou should close the ShopWise App and then restart it.");
resulttitle = "Restore was successful.";
//DBHelper.reopen(context); <== implemented as below
}
..... Displays dialog with text from above
これはDBHelper(メソッドはテーブルを修正/作成するために使用される拡大に注意してください)
class DBHelper extends SQLiteOpenHelper {
private static final String DBNAME = DBConstants.DATABASE_NAME;
/**
* Consrtuctor
*
* @param context activity context
* @param name database name
* @param factory cursorfactory
* @param version database version
*/
DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* Instantiates a new Db helper.
*
* @param context the context
*/
DBHelper(Context context) {
super(context, DBConstants.DATABASE_NAME, null, 1);
}
private static DBHelper instance;
/**
* Gets helper.
*
* @param context the context
* @return the helper
*/
static synchronized DBHelper getHelper(Context context) {
if(instance == null) {
instance = new DBHelper(context);
}
return instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
expand(db, false);
}
.......
ですあなたはデータベースを閉じて、それを再び開くべきだと考えます。 (コメントの通り)OKであった復元コード内からこれを起動次に
public static void reopen(Context context) {
instance.close();
instance = null;
instance = new DBHelper(context);
}
と - を:私は次のようにDBHelper方法を再度追加しようとしました。
java.lang.IllegalStateException - :しかし、これは次のようになりSQLiteDatabase:再オープンし、すでに閉鎖 オブジェクトへの試み
02-16 16:41:20.938 2683-3050/mjt.shopwise E/SQLiteLog: (28) file unlinked while open: /data/data/mjt.shopwise/databases/ShopWise
02-16 16:41:25.171 2683-2683/mjt.shopwise D/AndroidRuntime: Shutting down VM
02-16 16:41:25.171 2683-2683/mjt.shopwise E/AndroidRuntime: FATAL EXCEPTION: main
Process: mjt.shopwise, PID: 2683
java.lang.RuntimeException: Unable to resume activity {mjt.shopwise/mjt.shopwise.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/mjt.shopwise/databases/ShopWise
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2986)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/mjt.shopwise/databases/ShopWise
at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1312)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at mjt.shopwise.DBCommonMethods.getTableRows(DBCommonMethods.java:106)
at mjt.shopwise.DBCommonMethods.getTableRows(DBCommonMethods.java:59)
at mjt.shopwise.DBCommonMethods.getTableRowCount(DBCommonMethods.java:29)
at mjt.shopwise.DBCommonMethods.getTableRowCount(DBCommonMethods.java:43)
at mjt.shopwise.DBShopMethods.getShopCount(DBShopMethods.java:44)
at mjt.shopwise.MainActivity.getDBCounts(MainActivity.java:207)
at mjt.shopwise.MainActivity.onResume(MainActivity.java:163)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
at android.app.Activity.performResume(Activity.java:6076)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Quastionは前に5分を尋ね、あなたは即座にあなた自身の質問に答えますか? –
@VygintasB彼はこの似たような問題に直面する人を助けるので、この質問を投稿しました。私たちはそれを感謝しなければなりません:) – Redman
あなた自身の質問に答えることは役に立ちます。検索をして何も見つけずに解決策を決定した後、他人を助けることができます。だからこそ、あなた自身の質問に答えるときは、自分の質問に答えるチェックボックスがあります。* – MikeT