5

如何在 DatabaseHelper onUpgrade 中添加一列并将预先存在的行设置为特定值?

我试过了:

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    ...
       if (oldVersion < 2) {
          db.execSQL("ALTER TABLE " + MyTableName + " ADD COLUMN "
              + MyNewColumn + " TEXT;");      
          db.execSQL("UPDATE " + MyTableName  + " SET " +
               MyNewColumn  + "=" + "value for existing;");
       }
    }

但我认为更改尚未提交,因为它说该列不存在。有什么建议吗?

编辑:添加了更多周边代码

编辑:我的错误。我只是错过了价值部分的引用,而关于没有列的错误让我失望,但问题是它正在寻找我在没有引用的情况下使用的值的列。

4

2 回答 2

1

添加列并不像您显示的那样简单,因为 onUpgrade 将在您每次升级数据库时运行,并且第二次添加列将失败......如果您希望快速而肮脏地做到这一点,您可以尝试将其包装起来抓住

try {
    db.execSQL("ALTER TABLE sometable ADD COLUMN newcolumn integer");   
}
catch(Exception e) {
    e.printStackTrace();
}

更好的方法是将所有数据从表中移出到临时表中,删除并重新创建表,然后将数据放回。这是我之前使用过的示例

//Update old Table
        if(DBVER< 1060){

            List<String> columns = DB.GetColumns(db, "listitems");
            db.execSQL("ALTER table listitems RENAME TO 'temp_listitems); ") ;
            String tblListItems = "create table if not exists listitems " +
                    "(id integer primary key autoincrement, " +
                    "listid integer, " +
                    "itemid integer, " +
                    "qty integer, " +
                    "collected integer, " +
                    "qtytype integer, " +
                    "tabid integer); " ;
            db.execSQL(tblListItems);
            columns.retainAll(DB.GetColumns(db, "listitems"));
            String cols = DB.join(columns, ","); 
            db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", "listitems", cols, cols, "listitems"));
            db.execSQL("DROP table 'temp_" + "listitems");



        }

这是一个链接http://www.devdaily.com/android/sqlite-alter-table-syntax-examples

于 2012-05-14T19:48:28.797 回答
0
 db.execSQL("ALTER TABLE " + MyTableName + " ADD "
           + MyNewColumn + " TEXT;"); 

尝试不使用 Column: 语法是:

更改表 [TABLE_NAME] 添加 [COLUMN_NAME] 数据类型

于 2012-05-14T19:49:01.470 回答