onUpgrade Datenbank - oldVersion - newVersion
Ich bin mit diesem DataBaseHelper.class und ich bin fest auf der onUpgrade()-Methode. Ich weiß nicht, wie um herauszufinden, was die Versionsnummer der Datenbank. Könnte ich die version 1, das erste mal, dass ich es veröffentlichen und wenn ich ein update veröffentlichen, ich konnte einfach legen Sie die version 2 (myDataBase.setVersion(2);)
. Aber es werden nur 2, solange die app läuft. Wenn es das nächste mal gestartet wird, ist es 1 wieder. Das selbe passiert private static int DATABASE_VERSION
. Ich dachte über die Speicherung der version-Nummer in einer extra-Tabelle, aber das scheint nicht zu best-practice aus meiner Sicht.
So wie stellen Sie sicher, dass die Versionsnummer erhöht hat, nachdem ein upgrade und, dass es hält (der Wert, der zugewiesen wurde, um private static int DATABASE_VERSION
oder myDataBase.getVersion();
)?
Des DataBaseHelper Klasse:
public class DataBaseHelper extends SQLiteOpenHelper {
//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.mydatabase.db/databases/";
private static String DB_NAME = "database.sl3";
private SQLiteDatabase myDataBase;
private final Context myContext;
//Do you need this?
private static int DATABASE_VERSION = 2;
//or is this correct:
//private static int DATABASE_VERSION = myDataBase.getVersion();
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to
* the application assets and resources.
*
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
/**
* Creates an empty database on the system and rewrites it with your own
* database.
* */
public void
createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
}
else {
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getWritableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each
* time you open the application.
*
* @return true if it exists, false if it doesn't
*/
private boolean
checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
//database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created
* empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void
copyDataBase() throws IOException {
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
//Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void
openDataBase() throws SQLException {
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
//Which parameters do I have to pass?
onUpgrade(myDataBase, DATABASE_VERSION, 2);
}
@Override
public synchronized void
close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void
onCreate(SQLiteDatabase db) {
}
@Override
public void
onUpgrade( SQLiteDatabase db,
int oldVersion,
int newVersion) {
Log.d ("onUpgrade first log", Integer.toString(myDataBase.getVersion()));
if (oldVersion == 1) {
//do something
//And then do this!?
DATABASE_VERSION = 2;
//or do this
myDataBase.setVersion(2);
Log.d ("onUpgrade sedond log", Integer.toString(myDataBase.getVersion()));
}
else {
Log.d("onUpgrade", "else-clause: Already upgraded!");
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie brauchen das. (Noch besser, machen Sie es
final
zu.)Das sagt die Helfer-Datenbank, was die neueste version der Datenbank-schema. Dies sollte behoben werden in Ihrem app-code, und erhöht, wenn Sie ändern Sie das schema.
Wenn Ihr die app startet, können die Helfer eine überprüfung zur Laufzeit, dass Ihr code die Idee, die neueste version ist die gleiche wie die version, die aktiv war, als die Datenbank wurde zuletzt erstellt oder aktualisiert. (Dies ist, was
db.getVersion()
ist.) Wenn die zahlen nicht übereinstimmen, dann den Helfer weiß, dass die gespeicherte Datenbank wird out-of-date hinsichtlich Ihrer Anwendung code, und so läuft die upgrade-routine.Sieht es aus, als ob Sie nicht erstellen Sie die Datenbank von Grund auf neu, sondern importieren Sie eine vorhandene Datenbank aus Ihrem Vermögen. Wenn Sie dies tun Initiale import ist dies der Zeitpunkt, um sicherzustellen, dass die gespeicherten version übereinstimmt code version; entweder direkt anwenden auf die Datenbank-Datei in Ihr Vermögen, oder, wenn Sie sicher sind, dass die Datenbank-Datei in Ihr Vermögen mit der code, dann rufen Sie
setVersion(DATABASE_VERSION)
.In jedem Fall sollten Sie nicht versuchen, ändern Sie die Versionsnummern in die
onUpgrade()
routine. Dies ist immer nur dann aufgerufen wird, wenn die Versionen nicht übereinstimmen, und alles, was Sie tun sollen hier machen, was änderungen sind notwendig, um die Datenbank up-to-date. Die Helfer verwalten die Speicherung der neuen version-Nummer, sobald die Aktualisierung abgeschlossen ist.public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { /* This line: */ this.getWritableDatabase();}...
Außerdem onUpgrade() aufgerufen, wenn ein neues Objekt der Klasse DataBaseHelper erstellt wird, aber nur wenn die Datenbank version die Nummern nicht übereinstimmen. Dies bedeutet, dass es keine Notwendigkeit zu nennen onUpgrade "auf eigene Faust". Wenn Sie ein update veröffentlichen, der db, nur erhöhen Sie die version nr um eins und übernehmen Sie die änderungen in der onUpgrade()-Methode. Hoffe, das hilft jemand!Hinzufügen einige Infos zu Graham Borland Antwort.
Ich werde erklären, mit dem Szenario der Anwendung, in dem Ihre Datenbank befindet sich im asset-Ordner
und kopieren Sie es auf Ihr Paket-Ordner, falls nicht bereits vorhanden.
Nun, wenn Sie möchten, aktualisieren Sie Ihre app mit einer aktualisierten Datenbank aktualisiert wurde.
Sie müssen
in Ihre Datenbank-helper-Klasse.
(Eine ganze Zahl, die mehr sein soll als erste db-version, das du erstmal in dieser Klasse)
Danach müssen Sie code hinzufügen für die überschreibung onUpgrade()
In diesem scenarion ich overrite alte db mit der neuesten.Sie können den code ändern, wie Ihre Vorliebe
Wenn Sie müssen irgendeine Erklärung postet bitte im Kommentar 🙂