在 Android SQLite 中,我们是否也应在 onCreate() 中添加新列?

In Android SQLite shall we add the new column in onCreate() too?

我想在 SQLite 中为我的 table 之一添加新列。

我知道我可以通过在 OnUpgrade() 方法

中添加以下内容来为现有用户实现此目的
db.execSQL("ALTER TABLE my_table ADD COLUMN my_column2 INTEGER DEFAULT 0");

并且在onCreate()方法中,table创建将保持如下

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

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

那么我也要更新 onCreate() 中的 table 创建吗?否则会给现有用户带来问题?

Now what if a new user install the application? only onCreate() will be called because user doesn't have any previous version of the database.

这就是 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");
    }
}