2017-02-16 11 views
0

データベースのバックアップと復元をアプリケーションに組み込んでいます。これはすべて正常に動作しますが、データベースの復元時には、シングルトン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)  

答えて

1

はトリックが、非常に簡単ですDBHelperをリセットするだけでデータベースを閉じないでください。

ので、再度開く方法は次のようになります - もちろん

public static void reopen(Context context) { 
     instance = new DBHelper(context); 
    } 

を、あなたはまた、アプリケーションを閉じて再起動するようにユーザーに伝えるテキストを離れて行うことができます。

ので検出し、成功に関するレポートが復元コードは次のようになります -

if(copytaken && origdeleted && restoredone) { 
        errlist.add("Database successfully restored."); 
        resulttitle = "Restore was successful."; 
        DBHelper.reopen(context); <== implemented as below 
       } 
+0

Quastionは前に5分を尋ね、あなたは即座にあなた自身の質問に答えますか? –

+0

@VygintasB彼はこの似たような問題に直面する人を助けるので、この質問を投稿しました。私たちはそれを感謝しなければなりません:) – Redman

+0

あなた自身の質問に答えることは役に立ちます。検索をして何も見つけずに解決策を決定した後、他人を助けることができます。だからこそ、あなた自身の質問に答えるときは、自分の質問に答えるチェックボックスがあります。* – MikeT

関連する問題