数据库更新而不会丢失数据

时间:2018-12-17 10:53:43

标签: sqlite android-sqlite

有一个包含3列的表格:id,标题,诗歌,收藏夹。

因此,收藏夹被写为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 :(得分:0)

在这种情况下,您似乎正在用新的,干净的空数据库覆盖“旧”数据库。我建议尝试将旧数据库文件复制到临时备份,用新的,干净的空数据库文件覆盖旧数据库文件。

然后,您必须定义升级策略,即字段如何从v。1移到v。2。如果删除字段,会发生什么?如果添加新字段会怎样?您的某些数据是否已重组?最好在纸上勾勒出这种练习。

您现在可以按照上面概述的策略,将旧的备份数据库附加到新的干净数据库中(请参见SQL命令ATTACH),并从旧数据库中将新记录插入到新数据库中。

如果发生任何故障,您始终可以还原到备份文件并通知用户,而不用丢失其所有数据。