Обновление базы данных без потери данных - PullRequest
0 голосов
/ 17 декабря 2018

есть таблица с 3 столбцами: id, title, poem, favour.

Итак, избранное написано 1 или 0, по умолчанию 0, оно меняется, если пользователь добавляет строку вИзбранное.

Проблема в том, что если я обновлю базу данных (добавлю больше строк), все избранное исчезнет у пользователя.Как перенести избранное из старой базы данных в новую в методе onUpgrade?

Код класса DbHelper

public class PoemsDbHelper extends SQLiteOpenHelper {
private static String DB_NAME = "brodsky.db";
private static String DB_PATH = "";
private static final int DB_VERSION = 3;

private SQLiteDatabase db;
private final Context context;
private boolean needUpdate = false;

public PoemsDbHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    if (android.os.Build.VERSION.SDK_INT >= 17)
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    else
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.context = context;

    copyDataBase();

    this.getReadableDatabase();
}

public void updateDataBase() throws IOException {
    if (needUpdate) {
        File dbFile = new File(DB_PATH + DB_NAME);
        if (dbFile.exists())
            dbFile.delete();

        copyDataBase();

        needUpdate = false;
    }
}

private boolean checkDataBase() {
    File dbFile = new File(DB_PATH + DB_NAME);
    return dbFile.exists();
}

private void copyDataBase() {
    if (!checkDataBase()) {
        this.getReadableDatabase();
        this.close();
        try {
            copyDBFile();
        } catch (IOException mIOException) {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}

private void copyDBFile() throws IOException {
    InputStream input = context.getAssets().open(DB_NAME);
    //InputStream input = context.getResources().openRawResource(R.raw.info);
    OutputStream output = new FileOutputStream(DB_PATH + DB_NAME);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = input.read(buffer)) > 0)
        output.write(buffer, 0, length);
    output.flush();
    output.close();
    input.close();
}

public boolean openDataBase() throws SQLException {
    db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    return db != null;
}

@Override
public synchronized void close() {
    if (db != null)
       db.close();
    super.close();
}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion)
        needUpdate = true;
}

}

1 Ответ

0 голосов
/ 17 декабря 2018

В этом случае кажется, что вы перезаписываете свою «старую» базу данных новой, чистой, пустой базой данных.Я предлагаю попробовать скопировать старый файл базы данных во временную резервную копию, перезаписать старый файл базы данных новым, чистым, пустым файлом базы данных.

Затем вы должны определить стратегию обновления, т.е. как поля перемещаются из v. 1 в v. 2. Что произойдет, если вы удалили поле?Что произойдет, если вы добавили новое поле?Были ли некоторые ваши данные реструктурированы?Это упражнение лучше всего набросать на бумаге.

Теперь вы можете присоединить старую резервную копию базы данных к новой чистой базе данных (см. Команду SQL ATTACH) и вставить новые записи в новую.базы данных из старой, следуя стратегии, которую вы набросали выше.

Если что-то не получается, вы всегда можете вернуться к файлу резервной копии и уведомить пользователя, вместо того, чтобы потерять все его данные.

...