Android SQLite数据库,为什么删除表并在升级时重新创建

Esq*_*uth 29 database sqlite android drop-table database-update

在我正在关注的教程和我看到的更多地方,onUpgrade - > drop table if exists,然后重新创建表.

这样做的目的是什么?

private static class DbHelper extends SQLiteOpenHelper{

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL, " +
                KEY_HOTNESS + " TEXT NOT NULL);"
        );  
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }       
}
Run Code Online (Sandbox Code Playgroud)

小智 32

嗯,Android应用程序中最常见的方法是在数据库升级有序时"重新"用户.并且考虑到任何本地数据库应该仅镜像服务器端应用程序上的内容,只需删除数据库,重新创建数据库并从服务器重新填充,而不是仔细规划从一个版本到另一个版本的迁移.

它当然不是最好的方法,但它更容易.

举例来说明它将如何实现迁移(从旧版本的数据库更改为更新的版本)

让我们在您的DbHelper类中定义您的数据库是版本1,在更高版本的应用程序(版本2)中,您需要在其中一个表中添加更多列.

因此,您需要升级表并通过ALTER TABLE {tableName} ADD COLUMN COLNew {type}添加列;

检查此链接 - > 在sqlite中将新列插入表中?

所以你的onUpgrade()方法必须通过添加以下内容来反映这种变化:

 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch(oldVersion){
        case 1:
            db.execSQL("ALTER TABLE " + DATABASE_TABLE + " ADD COLUMN " + NEW_COLUMN_NAME + TYPE);
    }
}  
Run Code Online (Sandbox Code Playgroud)


dan*_*117 32

我同意在升级时应该添加列或向数据库添加表.大多数onupgrade样本实际上很糟糕,因为为什么我删除所有这些数据然后重新创建表?我发现这个博客文章我称之为Adams增量更新方法.它还处理用户可能未在每个版本中升级您的应用程序的情况.

这是一个关于sqlite onupgrade的好博客,不做drop table.

  • 链接中的循环是否有特殊原因?如果你只是遗漏休息陈述并让它失败怎么办?它始终以您最早的旧版本匹配,然后从该版本逐步升级到您的最新版本,除非我在这里遗漏了一些东西. (3认同)