2017-09-20 2 views
0

Zuvor habe ich eine Datenbank mit db = openOrCreateDatabase("LOCALTILEDB", Context.MODE_PRIVATE, null); erstellt, die eine Datenbank mit der Version '0' erstellt.SQLite Datenmigration von Version 0 zu 1

In der nächsten Version der Anwendung verwende ich SQLiteOpenHelper-Klasse, in der OnUpgrade-Methode zeigt den Fehler namens, Datenbank-Version kann nicht '0' sein.

Also bitte helfen mir alle, Daten von meiner 0 Version der DB auf Version 1 DB zu migrieren.

+1

Ich habe das noch nicht vollständig untersucht, aber was Sie tun könnten, ist, Ihre aktuelle Datenbank zu öffnen (mit getWriteableDatabase()) und dann mit '' zu starten execSQL' Methode, die folgende SQL 'PRAGMA user_version = 1'. Wie kann man jedoch die Versionsnummer ändern? Ich werde wahrscheinlich ein bisschen spielen, um zu sehen, was ich daraus machen kann. – MikeT

+0

Laut Antwort müssen Sie PRAGMA nicht verwenden, um die Version zu ändern. – MikeT

Antwort

0

In Ihrer Klasse, die mit SQLiteOpenHelper erweitert wird, übergeben Super (Kontext, DATABASE_NAME, NULL, DATABASE_VERSION) auf Standardkonstruktor. Für Beispiel

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

Ich vermute, dass das, was Sie eine Version von 0 zu codieren tat, war, der über die Super z geben wurde : -

public static final int DBVERSION = 0; 

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

Dies Ausnahme führt die Version must be >= 1, was 0

z.B. enthält - Allerdings

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) 

, einfach eine von Null verschiedene, positive Version Codierung, dass in der Super-Methode übergeben wird, wird dann in dieser Version zur Folge verwendet wird.


z.B. Ich habe eine DB festgelegt, dass Version 0 (PRAGMA user_version=0 verwenden, gefolgt von PRAGMA user_version (abruft Version) und verfügen über: -

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 

ich dann verwenden Version 100: -

public static final int DBVERSION = 100; 

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

Also das springt direkt auf die Version 100 (ONUPGRADE Methode ist leer) gemäß: -.

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

natürlich auch 1 Werken


Zum Testen/die oben Herstellung verwendete ich die folgenden Methoden: -

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; 
} 

Anmerkung 1 haben zu verwenden, nicht ExecSQL funktioniert nach Android: PRAGMA statements that set data don't work

Mit dem folgenden Code in der MainActivity

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

Offensichtlich variiert die Parameter (zuerst ist die Version zu ändern, so dass die aktuelle Version übereinstimmen muss, und die zweite ist die Version zu ändern, wenn der erste zusammenpasst). Das obige Beispiel wird Version 1 in Version 0 ändern.