如何将新列添加到Android SQLite数据库?

Aam*_*han 77 database sqlite android

我有Android SQLite数据库的一个问题.

我有一个表包含一个field.StudentFname和该应用程序与Android 2.3.1正常工作,现在如果我添加另一个字段,那么我的应用程序无法正常工作.

任何人都可以帮助我了解数据库的人,

Dev*_*udh 177

你可以ALTER TABLE在你的onUpgrade()方法上使用函数,如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,SQLite将根据列定义而有所不同.

  • 不要忘记增加数据库版本,否则不会调用onUpgrade().增加下面代码中的版本号,该代码将出现在扩展SQLiteOpenHelper类的类的构造函数中.super(Context context,String name,CursorFactory factory,int newVersion) (2认同)

PFr*_*ise 27

我在自己的应用程序上需要帮助时遇到了这个帖子,但是看到了很多答案的问题.我建议你做以下事情:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}
Run Code Online (Sandbox Code Playgroud)

您希望确保在用户升级多个版本时代码将起作用,并且update语句仅运行所需的一次升级.有关这方面的更多信息,请查看此博客.

  • 我读过的最好的解决方案和btw的好博客! (3认同)

use*_*305 22

最简单的方法是SQL to the onUpgrade()在你的方法中添加一些方法SQLiteOpenHelper class.就像是:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    // If you need to add a new column
    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
    }
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*gby 14

也许使用switch而不是if/then会稍微优雅的方法将从任何架构升级到最新的架构......

这里也是改变表格语法的一个不错的页面:http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    switch (oldVersion)
    {
        case 1:
            //upgrade from version 1 to 2
            db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
        case 2:
            //upgrade from version 2 to 3
            db.execSQL(DATABASE_ALTER_TEAM_TO_V3);

        //and so on.. do not add breaks so that switch will
        //start at oldVersion, and run straight through to the latest

    }

}
Run Code Online (Sandbox Code Playgroud)


sss*_*ock 5

我已经完成了以下方法,它已为我解决

如果数据库版本:6

Ex : There is a table with 5 columns
Run Code Online (Sandbox Code Playgroud)

当您升级到:7(我在 3 个表中添加 1 个新列)

 1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }
Run Code Online (Sandbox Code Playgroud)

其中:“DATABASE_ALTER_ADD_PAPER_PAID”是查询。

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
Run Code Online (Sandbox Code Playgroud)

经过以上两个操作后,对于全新安装用户和应用程序升级用户来说就可以正常工作了