我在Android的SQLite
数据库中遇到了一个问题。
我有一张表,其中包含一个字段: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将根据列定义而有所不同。
在我自己的应用程序需要帮助时,我看到了这个线程,但发现许多答案存在问题。我建议采取以下措施:
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);
}
}
你希望确保代码在用户升级超过1个版本时能正常工作,并且更新语句只运行所需的一个升级。想要了解更多,请查看这篇博客。
最简单的方法是在你的SQLiteOpenHelper类
的onUpgrade()
方法中添加一些SQL
。例如:
@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,我认为你早就解决了你在评论中提到的问题。我认为你没有增加数据库版本。否则这里的答案是直截了当的。我写这篇文章是因为它可能会帮助那些在修改表时没有增加或更改其数据库版本号的人。
if (newVersion > oldVersion) {
}
因为如果我们使用这种方式,那么每当我们增加数据库版本时,onUpgrade() 方法都会被调用并且条件将为真,所以我们应该像这样进行检查。
if(oldVersion==1)
{
}
因此,在此情况下,如果旧版本为2,则条件将为false,并且具有旧版本2的用户将不会更新数据库(用户仅需使用版本1),因为对于这些用户,数据库已经更新。
只需更改您的代码
private static final int DATABASE_VERSION = 2;
即可。
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");
}
}
onUpgrade
方法中,您可以检查列是否已存在,如果不存在,则仅添加该列。@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(!existsColumnInTable(db, TABLE_NAME, COLUMN_NAME)){
db.execSQL("ALTER TABLE foo ADD COLUMN COLUMN_NAME INTEGER DEFAULT 0");
}
}
private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) {
Cursor cursor = null;
try {
// Query 1 row
cursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null);
// getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1
if (cursor.getColumnIndex(columnToCheck) != -1)
return true;
else
return false;
} catch (Exception Exp) {
return false;
} finally {
if (cursor != null) cursor.close();
}
}
这个方法是从这个链接提取的 在Android应用程序数据库中检查列是否存在
if (newVersion > oldVersion)
是不必要的,因为只有当新版本大于旧版本时,onUpgrade
才会被调用。 - beginner