Ответ 1
onUpgrade()
вызывается только в том случае, если обнаружено изменение номера версии базы данных. Увеличьте версию базы данных следующим образом:
private static final int DATABASE_VERSION = 2;
Я работаю над приложением android, где я использовал существующую базу данных sqlite в папке с ресурсами. Поэтому я фактически копирую базу данных из этой папки. Пользователь также может сохранять свои собственные данные (отметьте любой контент как избранный).
Я загрузил версию на рынок. Теперь я хочу добавить новые данные в базу данных и загрузить новую версию. Если пользователь обновляет приложение с рынка, я хочу сохранить данные пользователя (из предыдущей версии) и добавить новые данные. Я сделал несколько google и обнаружил, что метод обновления должен делать трюк. Но я меняю DATABASE_VERSION на код, но метод обновления не получает вызова. Мне интересно, я что-то пропустил. Вот мой код:
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);
}
}
onUpgrade()
вызывается только в том случае, если обнаружено изменение номера версии базы данных. Увеличьте версию базы данных следующим образом:
private static final int DATABASE_VERSION = 2;
Измените onUpgrade на следующий
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion > oldVersion){
myContext.deleteDatabase(DB_NAME);
}
}
И также измените ваш createDataBase(), как показано ниже,
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
// By calling this method here onUpgrade will be called on a
// writable database, but only if the version number has been increased
this.getWritableDatabase();
}
dbExist = checkDataBase();
if(!dbExist){
//By calling this method an empty database will be created into the default system path
//of the application so we will be able to overwrite that database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
В конце увеличьте версию своей базы данных и запустите ее снова. onUpgrade
не вызывается до вызова getReadableDatabase()
или подобных функций.
Надеюсь, что это поможет
Попробуйте это (увеличьте DATABASE_VERSION) и вызывается onUpdate():
private static final int DATABASE_VERSION = 2;
Предполагая, что вы изменили DATABASE_VERSION, вам все равно придется поместить код в onUpgrade, чтобы это произошло. Это не волшебство, вы должны сказать, что делать.
В вашем случае вам нужно:
1) скопируйте старую базу данных (дайте ей новое имя)
2) копия в новой базе данных
3) прочитать данные из старой базы данных
4) скопируйте любые различия в новую базу данных
5) удалить старую базу данных
ИЗМЕНИТЬ
Предполагая, что вы отправляете БД в папку с ресурсами, вы должны скопировать ее для использования следующим образом:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// First copy old db
InputStream bakInput = getActivity().getAssets().open(dbname);
String bakFileName = getActivity().getAssets() + "YourDB.old";
OutputStream bakOutput = new FileOutputStream(bakFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = bakInput.read(buffer)) > 0) {
bakOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
// delete the old db
File delDB = new File(getActivity().getAssets() + "YourDB");
boolean deleted = file.delete();
// Copy in the new db
InputStream myInput = getActivity().getAssets().open("YourDB");
String outFileName = MAIN_DB_PATH + dbname;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
// add code here to get changes user has made to db and move them to updated db
// delete the old db copy
File delDB = new File(getActivity().getAssets() + "YourDB.old");
boolean deleted = file.delete();
}