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


82

我对AndroidSQLite数据库有一个问题。

我有一个包含一个字段的表.StudentFname并且该应用程序在Android 2.3.1上运行良好,现在如果我添加另一个字段,则我的应用程序无法正常运行。

谁能帮助我非常了解数据库的我,

Answers:


188

您可以在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");
  }
}

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


1
嗨!我已经尝试过这个,我已经在upgrate方法上使用过,并且我也将alter table query ..但是我仍然无法向数据库中添加新列..但是当我编写查询以添加新列并重命名时数据库和表名都比我能够添加新列..但是在alter table方法的帮助下我无法做到..重命名数据库和表不是所需的任务..它应该与alter一起使用table..still我不能够用alter table的方法来做到这一点..
阿米尔·罕

@NagarjunaReddy很抱歉延迟回复。您可以使用此方法db.execSQL(“ UPDATE table SET key = key + 1 WHERE name =?”,new String [] {name});
DevYudh 2013年

3
不要忘记增加数据库版本,否则不会调用onUpgrade()。在下面的代码中增加版本号,该版本号将出现在扩展SQLiteOpenHelper类的类的构造函数中。超级(上下文上下文,字符串名称,CursorFactory工厂,int newVersion)
appdroid

应用程序冻结,我在日志猫上收到许多这样的消息:数据库'+ data + user + 0 + com ..._ db'的连接池无法授予标志为0x5的线程1(主)的连接。为什么会这样?
马赫迪

29

在我自己的应用程序上需要帮助时,我遇到了这个线程,但是看到了许多答案的问题。我建议您执行以下操作:

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);
    }
}

您想确保当用户升级多个版本时该代码能够正常工作,并且update语句仅运行所需的一个升级。有关更多信息,请查看此博客


如果我们想使用默认String值创建更改的列怎么办?
shridutt kothari,2015年

22

最简单的方法是在.NET中添加一些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");
    }
}

我已经尝试过了,但是仍然无法通过upgrate方法中的alter table方法添加新列。
Aamirkhan 2011年

嗨!我已经尝试过这个,我已经在upgrate方法上使用过,并且在其中我还放置了alter table query。但是仍然无法将新列添加到数据库..但是当我编写查询以添加新列并重命名时数据库和表名都比我能够添加新列..但是在alter table方法的帮助下我无法做到..重命名数据库和表不是所需的任务..它应该与alter一起使用table..still我还是不能用alter table方法做到这一点
Aamirkhan 2011年

@ user370305我是否必须在tablle create语句中为首次安装该应用程序的新用户添加新列?
Ahesanali Suthar '16

15

也许使用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

    }

}

这是处理多个升级的方法。检查哪个版本来自!
里卡多

如果您直接从版本1转到版本3(如果有人没有自动更新该应用程序),则不会遇到情况
2。– TyMarc

@ TyMarc--是的,它将先升级到版本2,然后再升级到版本3。交换机使用旧版本。因此,在您的示例中,旧版本为1。代码将在案例1中运行,该案例从版本1升级到版本2,然后在案例2中运行(因为没有间断;),该案例从2升级到3。在说明中没关系。
爱德华·巴比

4

我做了以下方法,对我来说这是解决方法

如果数据库版本:6

Ex : There is a table with 5 columns

当您升级到: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); 
 }

其中:“ 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;";

经过上述两项操作,它对于全新安装用户和应用程序升级用户将正常工作


3

@ Aamirkhan.i认为您早就可以解决您在评论中提到的问题。我认为您没有增加数据库版本。否则,答案很简单。我之所以这样写,是因为它可能会帮助那些在更改表时未增加或更改数据库版本号的人。


是的,更改数据库名称并释放应用程序,然后再次重新安装将解决问题
Aamirkhan 2013年

@Aamirkhan,请将支票移至下一个答案,以便向公众提供更清晰的解决方案。
AlleyOOP,2014年

3

我认为我们不应该检查这种情况

 if (newVersion > oldVersion) {
 }

因为如果使用this,则意味着每次我们增加数据库版本时,onUpdrade()都会调用并且condition为true,因此我们应该像这样检查

if(oldVersion==1) 
{

}

因此,在这种情况下,如果旧版本为2,则条件将为false,并且具有旧版本2的用户将不会更新数据库(该用户只希望使用版本1),因为对于那些用户,数据库已更新。


1

要将新列添加到表中,您需要使用ALTER。在android中,您可以在中添加新列onUpgrade()

您可能想知道,如何onUpgrade()添加新列?

实现的子类时SQLiteOpenHelper,您需要在类构造函数super(context, DB_NAME, null, 1);中调用超类构造函数:。那里我已经通过1了版本。

当我将版本更改1为above(2或更高版本)时,onUpgrade()将被调用。并执行我打算做的SQL修改。我的类构造函数更改版本后:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

像这样进行SQL修改检查,超类构造函数将存储的SQLite db文件的版本与我传递给的版本进行比较super()。如果这些(先前和现在)版本号不同onUpgrade(),则调用该版本号。

代码应如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // add new columns to migrate to version 2
    if (oldVersion < 2) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
    }
    // add new columns to migrate to version 3
    if (oldVersion < 3) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
    }
}


0

我在搜索同一问题时遇到了链接。它说明了如何使用升级。 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

它解释了为什么使用下面的代码

 @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);
        }
    }

0

在表上创建新列的最简单方法是在SQLiteOpenHelper类的onUpgrade()方法中添加一些SQL。喜欢:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
            db.execSQL(SQL_MY_TABLE);

        case 2:
            db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.