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

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

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

谁能帮我谁知道数据库很好,

你可以在你的onUpgrade()方法上使用ALTER TABLE函数,就像这样:

 @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将根据列定义而有所不同。

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

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

当我在自己的应用程序上需要帮助时遇到了这个线程,但是看到了很多答案。 我会build议做以下几点:

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

您希望确保代码在用户升级多个版本时运行,并且更新语句只运行所需的一次升级。 想了解更多,请查看这个博客 。

也许稍微更优雅的方法使用开关,而不是如果/然后,将从任何模式升级到最新的模式…

这也是改变表的语法的一个体面的页面: 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 } } 

@Aamirkhan.i认为你可能已经解决了你在长久以前的评论中提到的问题。我认为你没有增加数据库版本。 否则这里的答案是直截了当的。我正在写这个,因为它可以帮助任何没有增加或改变数据库版本号的人。

我想我们不应该这样检查条件

  if (newVersion > oldVersion) { } 

因为如果我们使用这个,就意味着每当我们增加数据库版本的时候,onUpdrade()都会调用并且条件是真的,所以我们应该这样检查

 if(oldVersion==1) { } 

所以在这种情况下,如果旧版本是2,那么条件将是错误的,旧版本2的用户不会更新数据库(哪个用户只需要版本1),因为那些用户数据库已经更新。

我已经做了以下的方法,它是为我解决

如果数据库版本: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;"; 

经过以上两个操作,对于全新的安装用户和应用升级用户来说,这将工作得很好

我在search相同的问题时遇到了链接。 它解释了如何使用升级。 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); } } 

在表上创build新列的最简单方法是在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"); } } 

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

您可能会奇怪, onUpgrade()将如何添加新列?

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

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

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

SQL的修改是这样的,超类的构造函数比较存储的SQLite数据库文件的版本和我传递给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"); } }