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.
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
Laut Antwort müssen Sie PRAGMA nicht verwenden, um die Version zu ändern. – MikeT