Pracuję nad aplikacją dla systemu Android, gdzie użyłem istniejącej bazy danych sqlite w folderze zasobów. Więc faktycznie kopiuję bazę danych z tego folderu. Użytkownik może również zapisywać własne dane (zaznaczyć dowolną treść jako ulubioną).Sqlite database onUpgrade() nie jest wywoływana
Przesłałem wersję na rynek. Teraz chcę dodać kilka nowych danych do bazy danych i załadować nową wersję. Jeśli użytkownik zaktualizuje aplikację z rynku, chcę zachować dane użytkownika (z poprzedniej wersji) i dodać nowe dane. Zrobiłem trochę google i okazało się, że w metodzie aktualizacji powinno załatwić sprawę. Ale zmieniam DATABASE_VERSION z kodu, ale metoda aktualizacji nie otrzyma połączenia. Zastanawiam się, że coś przeoczyłem. Tu jest mój kodu:
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/riskycoder.login/databases/";
public static String DB_NAME = "datenbank_EN.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static final int DATABASE_VERSION = 1;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
this.getWritableDatabase();
try {
this.close();
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
}
if (checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[2048];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
//myDataBase.setVersion(DATABASE_VERSION);
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
Log.d("Test", "Database version: " +myDataBase.getVersion());
}
@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("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion);
}
}
* Zmieniam DATABASE_VERSION z kodu .. *, co to dokładnie oznacza? Widzę, że nazywasz super konstruktora 'SQLiteOpenHelper' ze stałym polem' DATABASE_VERSION' (którego oczywiście nie można zmienić), więc jak dokładnie zmieniasz wersję bazy danych? – Luksprog
W nowej wersji aplikacji zmieniłem DATABASE_VERSION na 2. Tak więc podczas instalacji nowej wersji powinna zostać wywołana metoda onUpgrade. Czy czegoś mi brakuje? – rawcoder064
Po pierwsze, kod, który wysłałeś showa DATABASE_VERSION ma wartość 1, więc funkcja onUpgrade nie zostanie wywołana.Po drugie, nawet jeśli był 2, twoja funkcja onUpgrade nie ma kodu, który można zrobić, aby zaktualizować bazę danych. Nie dzieje się to automatycznie, musisz to zrobić. – Barak