如何在Android SQLite数据库中添加两个新列?

14

我在安卓市场上有一个应用程序,现在想要更改数据库字段。我想在特定表中添加两个新字段。你能帮我学习如何向表中添加两个新列吗?

这是我的代码。

 private static final String ALTER_USER_TABLE = "ALTER TABLE user_table ADD user_society text,user_street1 text;"; 

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
 {
    db.execSQL(ALTER_USER_TABLE);
 }

执行后我遇到了以下错误。

W/System.err(  717): android.database.sqlite.SQLiteException: near ",": syntax error: ALTER TABLE user_table ADD user_society text,user_street1 text;
W/System.err(  717):    at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
W/System.err(  717):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1727)
W/System.err(  717):    at com.kbobs.org.database.Database$DatabaseHelper.onUpgrade(Database.java:48)
W/System.err(  717):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:108)
W/System.err(  717):    at com.kbobs.org.database.Database.OpenDatabase(Database.java:54)
W/System.err(  717):    at com.kbobs.org.ui.Login$2.handleMessage(Login.java:222)
W/System.err(  717):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(  717):    at android.os.Looper.loop(Looper.java:123)
W/System.err(  717):    at android.app.ActivityThread.main(ActivityThread.java:4627)
W/System.err(  717):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(  717):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err(  717):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
W/System.err(  717):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

1
可能是sqlite alter table add MULTIPLE columns in a single statement的重复问题。 - Sergey Glotov
2个回答

38

每次只能添加一列。将其分成两个ALTER TABLE语句,您就可以了。

private static final String ALTER_USER_TABLE_ADD_USER_SOCIETY = 
    "ALTER TABLE user_table ADD user_society TEXT";
private static final String ALTER_USER_TABLE_ADD_USER_STREET1 = 
    "ALTER TABLE user_table ADD user_street1 TEXT";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{
   db.execSQL(ALTER_USER_TABLE_ADD_USER_SOCIETY);
   db.execSQL(ALTER_USER_TABLE_ADD_USER_STREET1);
}

1
非常感谢您宝贵的时间,对我提供了很多帮助。 - Chirag
1
如果您创建一个临时表并将现有表的行复制到临时表中,这是可能的。删除现有表并重新创建一个表,然后从临时表中复制。 字符串table_temp =“create TEMPORARY table”+ tempTableName + .....“;” - Tarun
1
@DEV 既然这是一个老问题,但为了参考其他人来到这里:你不能在单个查询(alter)中执行这些操作,你必须每个操作执行一次。 - zed

0

在编程中,正确的添加新列到数据库的方式,例如在版本2中,应该是:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL("ALTER TABLE mytable ADD COLUMN mycolumn TEXT");
    }
}

它涵盖了所有的陷阱,包括一个重要问题:如果用户从版本1升级到版本3,他们将完全错过升级查询!这些用户将处于尴尬的困境中,他们会错过一些中间更新,并且没有预期的SQL模式。

另外,不要忘记修改创建语句以添加新列。


所以,我可以使用这个解决方案添加一个新的列,但它会将现有的数据库数据删除,新的数据为空。为什么会发生这种情况? - Mark Delphi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接