数据库更新不丢失数据

用户10261947

有一个包含 3 列的表格:id、title、poem、favorites。

因此,收藏夹写为 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;
}

}

甘布尔先生

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

然后你必须定义一个升级策略,即字段如何从 v.1 移动到 v.2。如果你删除一个字段会发生什么?如果添加新字段会发生什么?你的一些数据被重组了吗?这是一个最好在纸上勾勒出来的练习。

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

如果出现任何故障,您可以随时恢复备份文件并通知用户,而不是丢失他们的所有数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不丢失原始数据的情况下更新数据库架构

来自分类Dev

更新数据库不创建数据库

来自分类Dev

SQL查询不更新数据库

来自分类Dev

PHP的形式不更新数据库

来自分类Dev

Laravel函数不更新数据库

来自分类Dev

ExecuteNonQuery() 不更新数据库

来自分类Dev

PHP ajax不更新数据库

来自分类Dev

Mysql不更新数据库

来自分类Dev

SaveChangesAsync() 不更新数据库

来自分类Dev

DbContext 不更新数据库

来自分类Dev

编辑不更新数据库

来自分类Dev

更改哈希而不丢失数据库用户

来自分类Dev

如何在不丢失数据的情况下更新已部署的ASP MVC网站上的数据库模型

来自分类Dev

如何在不丢失数据的情况下更新已部署的ASP MVC网站上的数据库模型

来自分类Dev

WordPress的数据库丢失

来自分类Dev

sql更新不更改数据库中的数据

来自分类Dev

从数据库检索数据后,Angular View不更新

来自分类Dev

如何在更新数据库后将属性添加到实体框架模型类而不丢失它们

来自分类Dev

MySQL数据库迁移丢失数据

来自分类Dev

更新数据库不更新身份表

来自分类Dev

MySQLi准备更新而不更新数据库

来自分类Dev

我如何在使用Adonis的迁移中更改列类型而不丢失数据库数据?

来自分类Dev

实体框架-更新数据库-不创建数据库

来自分类Dev

PHP不更新数据库中的行

来自分类Dev

SqlDataAdapter.update()不更新数据库

来自分类Dev

jpa实体不更新数据库中的关系操作

来自分类Dev

Hibernate EntityManager.merge()不更新数据库

来自分类Dev

C#ExecuteNonQuery不更新数据库

来自分类Dev

过程在执行时不更新数据库