我对AndroidSQLite
数据库有一个问题。
我有一个包含一个字段的表.StudentFname并且该应用程序在Android 2.3.1上运行良好,现在如果我添加另一个字段,则我的应用程序无法正常运行。
谁能帮助我非常了解数据库的我,
Answers:
您可以在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将根据列定义而有所不同。
在我自己的应用程序上需要帮助时,我遇到了这个线程,但是看到了许多答案的问题。我建议您执行以下操作:
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语句仅运行所需的一个升级。有关更多信息,请查看此博客。
最简单的方法是在.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");
}
}
也许使用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
}
}
我做了以下方法,对我来说这是解决方法
如果数据库版本: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;";
经过上述两项操作,它对于全新安装用户和应用程序升级用户将正常工作
@ Aamirkhan.i认为您早就可以解决您在评论中提到的问题。我认为您没有增加数据库版本。否则,答案很简单。我之所以这样写,是因为它可能会帮助那些在更改表时未增加或更改数据库版本号的人。
我认为我们不应该检查这种情况
if (newVersion > oldVersion) {
}
因为如果使用this,则意味着每次我们增加数据库版本时,onUpdrade()都会调用并且condition为true,因此我们应该像这样检查
if(oldVersion==1)
{
}
因此,在这种情况下,如果旧版本为2,则条件将为false,并且具有旧版本2的用户将不会更新数据库(该用户只希望使用版本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");
}
}
只需更改您的代码
私有最终int DATABASE_VERSION = 1;
至
私有静态最终int DATABASE_VERSION = 2;
我在搜索同一问题时遇到了链接。它说明了如何使用升级。 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);
}
}
在表上创建新列的最简单方法是在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");
}
}