如何添加新的列到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"); } }