【问题标题】:How to add two new Column to Android SQLite Database?如何向 Android SQLite 数据库添加两个新列?
【发布时间】:2012-05-11 06:44:31
【问题描述】:

我在 android 市场上有一个应用程序,现在我想更改数据库归档。我想在特定表中添加两个新字段。您能帮我如何在表中添加两个新列吗?

这是我的代码。

 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)

【问题讨论】:

标签: android database sqlite


【解决方案1】:

您一次只能添加一列。把它分成两个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);
}

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我。
  • 如果您创建一个临时表并将现有表的行复制到临时表中是可能的。删除现有表并重新创建一个并从临时表中复制。 String table_temp = "创建临时表"+ tempTableName + .....";
  • @DEV 因为这是一个老问题,但为了参考其他人来这里:您不能在单个查询中执行这些操作(alter),您必须在每个操作中执行一个。
【解决方案2】:

向数据库添加新列的正确方法(例如在版本 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 架构。

另外不要忘记更改添加新列的创建语句。

【讨论】:

  • 因此,我可以使用此解决方案添加一个新列,但它会删除数据库中的现有数据,而新列是空的。为什么会这样?
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多