2017-09-20 8 views
0

以前は、db = openOrCreateDatabase("LOCALTILEDB", Context.MODE_PRIVATE, null);を使用してバージョン '0'のデータベースを作成しました。バージョン0から1へのSQLiteデータのマイグレーション

私はSQLiteOpenHelperクラスを使用しています.OnUpgradeメソッドが呼び出されたエラーを示しています。データベースのバージョンは '0'にはなりません。

DBのバージョン0からバージョン1 DBにデータを移行するのを手伝ってください。

+1

私はまだこれを完全には見ていませんが、あなたができることは、現在のデータベースを開いて(getWriteableDatabase()を使用して) execSQL'メソッド、次のSQL 'PRAGMA user_version = 1'を実行します。しかし、それはどのようにバージョン番号の変更を処理するのです。私はおそらく私が思いつくことを見るために少し遊びをするでしょう。 – MikeT

+0

回答ごとに、PRAGMAを使用してバージョンを変更する必要はありません。 – MikeT

答えて

0

SQLiteOpenHelperで拡張されたクラスでは、デフォルトコンストラクタでsuper(context、DATABASE_NAME、null、DATABASE_VERSION)を渡します。例えば、

public class MyDBHelper extends SQLiteOpenHelper { 

// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "MyDb"; 


public MyDBHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase aSqLiteDatabase) { 

} @Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 

} 

}

0

私はあなたが何をしたか、スーパーなどを経由して渡された0のバージョンをコーディングすることだったと思われます -

public static final int DBVERSION = 0; 

public SO46316125DBHlpr(Context context) { 
    super(context, DBNAME, null, DBVERSION); 
} 

これはVersion must be >= 1, was 0

などを含む例外が発生します -

09-20 21:16:40.631 1840-1840/mjt.soqanda E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: mjt.soqanda, PID: 1840 
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{mjt.soqanda/mjt.soqanda.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 0 
                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                   at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                   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.IllegalArgumentException: Version must be >= 1, was 0 
                   at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:99) 
                   at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:77) 
                   at mjt.soqanda.SO46316125DBHlpr.<init>(SO46316125DBHlpr.java:23) 

しかし、単に非ゼロコーディング、スーパーメソッドに渡された正のバージョンは、その後使用されて、そのバージョンになります。


私は()のバージョンを取得しPRAGMA user_version続く、PRAGMA user_version=0を使用して、バージョン0(ようにDBを設定していました: -

09-20 21:29:35.117 19172-19172/? D/DBVERSION: The Database User Version is 1 
09-20 21:29:35.118 19172-19172/? D/CHGDBVERSION: Attempting to alter DB Version from 1 to new version 0 
09-20 21:29:35.152 19172-19172/? D/CHGDBVERSION: DB Version changed successfully, DB Version is now 0 

私は、使用したバージョン100: -

public static final int DBVERSION = 100; 

public SO46316125DBHlpr(Context context) { 
    super(context, DBNAME, null, DBVERSION); 
} 

だから、これは直接ジャンプバージョン100(ONUPGRADE方法は空である)ごとのように: - 。1つの作品だけでなくもちろん

09-20 21:35:45.344 27937-27937/mjt.soqanda D/DBVERSION: The Database User Version is 100 

012試験のため

/Iは、次のメソッドを使用する上に製造する: -

public void showDBVersion() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor csr = db.rawQuery("PRAGMA user_version",null); 
    if (csr.moveToFirst()) { 
     Log.d("DBVERSION","The Database User Version is " + csr.getString(0)); 
    } 
} 


public int alterDBVersion(SQLiteDatabase db, int fromversion, int toversion) { 

    int current_version = -1; 
    int changed_version = -1; 

    Cursor csr = db.rawQuery("PRAGMA user_version;",null); 
    if (csr.moveToFirst()) { 
     current_version = csr.getInt(0); 
    } else { 
     Log.d("CHGDBVERSION","Unable to get the current version."); 
     return current_version; 
    } 

    if (current_version == fromversion) { 
     Log.d("CHGDBVERSION","Attempting to alter DB Version from " + 
       Integer.toString(fromversion) + 
       " to new version " + 
       Integer.toString(toversion) 
     ); 
     db.rawQuery("PRAGMA user_version=" + Integer.toString(toversion) + ";",null); //NOTE 1 
     db.execSQL("PRAGMA user_version=" + Integer.toString(toversion) + ";"); 
    } 

    csr = db.rawQuery("PRAGMA user_version;",null); 
    if (csr.moveToFirst()) { 
     changed_version = csr.getInt(0); 
    } else { 
     Log.d("CHGDBVERSION","Unable to get the new/changed version."); 
     return -2; 
    } 
    if (current_version != fromversion || changed_version != toversion) { 
     Log.d("CHGDBVERSION", 
       "DB Version was not changed as requested. Version is now " + 
         Integer.toString(changed_version)); 
     return -3; 
    } else { 
     Log.d("CHGDBVERSION","DB Version changed successfully, DB Version is now " + 
     Integer.toString(changed_version)); 
    } 
    return 0; 
} 

注1が動作しないMainActivity

に次のコードで Android: PRAGMA statements that set data don't work

に従ってExecSQLメソッドを使用する必要が

SO46316125DBHlpr dbhlpr = new SO46316125DBHlpr(this); 
    dbhlpr.showDBVersion(); 
    dbhlpr.alterDBVersion(dbhlpr.getWritableDatabase(),1,0); 

明らかにパラメータを変更しています(最初は変更するバージョン、現在のバージョンはそれに一致する必要があり、2番目は変更するバージョンです)最初のものがマッチした場合)。上記の例では、バージョン1がバージョン0に変更されます。

関連する問題