Android: onUpgrade Aufruf nicht auf der Datenbank-upgrade
Ich bin die Entwicklung der zweiten version meiner Bewerbung. In denen ich stehe vor einem problem.
In meiner Anwendung befindet sich die Datenbank in dem Ordner "assets". Jetzt will ich update meine Datenbank aus dem Ordner "assets" in der zweiten version.
Habe ich versucht, den code zu aktualisieren, wie :
// Data Base Version.
private static final int DATABASE_VERSION = 2;
Ich habe die version von 1 auf 2.
//Konstruktor
public DataBaseHelperClass(Context myContext) {
super(myContext, DATABASE_NAME, null ,DATABASE_VERSION);
this.context = myContext;
//The Android's default system path of your application database.
DB_PATH = "/data/data/com.example.myapp/databases/";
}
//Create data base
public void createDataBase() throws IOException{
//check if the database exists
boolean databaseExist = checkDataBase();
if(databaseExist){
this.getWritableDatabase();
}else{
this.getReadableDatabase();
try{
copyDataBase();
} catch (IOException e){
throw new Error("Error copying database");
}
}// end if else dbExist
} // end createDataBase().
//Datenbank überprüfen
public boolean checkDataBase(){
File databaseFile = new File(DB_PATH + DATABASE_NAME);
return databaseFile.exists();
}
//Datenbank kopieren von assets
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = context.getAssets().open(DATABASE_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DATABASE_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the input file to the output file
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();
}
//Datenbank öffnen
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DATABASE_NAME;
sqliteDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
//Datenbank schließen
@Override
public synchronized void close() {
if(sqliteDataBase != null)
sqliteDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
// No need to write the create table query.
// As we are using Pre built data base.
// Which is ReadOnly.
}
//Auf "Datenbank Aktualisieren".
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion){
context.deleteDatabase(DATABASE_NAME);
try {
copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
} else {
}
}
Aber das Problem ist, dass die Datenbank nicht aktualisiert wird, nach dem ausführen der apk in das Gerät.
Nun, was soll ich tun.
Meine Anwendungen erste version auf dem Markt ist. Weiß nicht, wie "Datenbank aktualisieren" in der zweiten version.
Bitte guide mich mit Ihren wertvollen Anregungen, ich bin in der Mitte meiner Anwendung, und ich bin nicht in der Lage, sich zu bewegen.
EDIT : onUpgrade nicht aufrufen. Als ich versuchte, zu drucken log-in 1. Linie in der onUpgrade aber es wird nicht gedruckt. Also das Problem ist, dass, onUpgrade nicht aufrufen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um ein upgrade Ihrer Datenbank, die Sie tun müssen, um richtig durch die Bearbeitung der schema-ich fand auch die Antworten für meine Fragen wurden hilfreich...
Aktualisierung einer Datenbank-version automatisch
Dies ist vor allem beantwortet in diesem link: Warum ist onUpgrade() nicht aufgerufen wird, verwendet Android sqlite-Datenbank?
onUpgrade()
wird aufgerufen ingetWriteableDatabase()
odergetReadableDatabase()
, so dass, wenn Sie öffnen Sie niemals die DB für das schreiben oder Lesen-speziell, müssten Sie manuell aufrufen, durchonUpgrade()
oder öffnen Sie Ihre Datenbank.Testen Sie Ihre onUpgdate sollten Sie:
adb install -r
.-r
- Taste simuliert die app-update-Prozess. Ohne-r
Schlüsseladb install
nur löscht die alte version und intalls neue, so onUpgrade nicht genannt.Aber Sie besser einen test schreiben für diesen Zweck. Google es.
Bekam ich meine Antwort. Die änderungen, die ich getan haben, sind im Konstruktor nur als :
und es funktioniert für mich.
Wenn wir die exist-Datenbank copy-Methode, die wir haben, um das aktuelle DB-version zu SQLiteDatabase-Instanz. Und jedes mal, wenn Sie wollen, aktualisieren Sie die app aufrufen getWritableDatabase(), die onUpgrade () - Funktion wird aufgerufen werden.
}