【问题标题】:In Android SQLite shall we add the new column in onCreate() too?在 Android SQLite 中,我们是否也应该在 onCreate() 中添加新列?
【发布时间】:2020-11-01 07:09:30
【问题描述】:

我想在 SQLite 中为我的一个表添加新列。

我知道我可以通过在OnUpgrade() 方法中添加以下内容来为现有用户实现此目的

db.execSQL("ALTER TABLE my_table ADD COLUMN my_column2 INTEGER DEFAULT 0");

onCreate() 方法中,表的创建将保持如下

 db.execSQL("CREATE TABLE IF NOT EXISTS \"my_table\" (\"coulmn_1\" INTEGER PRIMARY KEY  NOT NULL  UNIQUE)");

现在如果新用户安装应用程序会怎样?只有onCreate() 将被调用,因为用户没有任何以前版本的数据库。而在onCreate() 方法中,它不包含新列coulmn_2

那么我也应该更新onCreate() 中的表创建吗?还是会给现有用户带来问题?

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    现在如果新用户安装应用程序会怎样?只有 onCreate() 会 被调用是因为用户没有任何以前版本的 数据库。

    这就是为什么onCreate() 中的CREATE TABLE 语句必须包含新列:

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
            "CREATE TABLE IF NOT EXISTS my_table(" +
            "column_1 INTEGER PRIMARY KEY  NOT NULL, " +
            "my_column2 INTEGER DEFAULT 0)"
        );
    }
    

    onCreate() 方法仅在数据库不存在时调用,这意味着上述语句将在没有您以前版本的应用程序和旧数据库的设备上执行。

    对于已经安装了之前版本应用的用户,onCreate() 将不会被调用,但onUpgrade() 将被执行,您应该在其中放置添加新列的代码。
    因此,例如将数据库的版本更改为 2(这与您的应用程序的版本不同)并且:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
             db.execSQL("ALTER TABLE my_table ADD COLUMN my_column2 INTEGER DEFAULT 0");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多