Android SQLite
数据库存在一个问题。
我有一个包含一个field.StudentFname的表 并且该应用程序在Android 2.3.1中运行良好,现在如果我添加另一个字段,那么我的应用程序无法正常工作。
任何人都可以帮助我了解数据库的人,
答案 0 :(得分:172)
您可以在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 :(得分:22)
最简单的方法是在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");
}
}
答案 2 :(得分:22)
在我自己的应用程序上需要帮助时遇到了这个帖子,但是看到了许多答案的问题。我建议你做以下事情:
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个以上版本时代码能够正常工作,并且update语句只运行需要的升级。有关详细信息,请查看此blog。
答案 3 :(得分:13)
使用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
}
}
答案 4 :(得分:3)
@ Aamirkhan.i认为你会解决你在很久以前的评论中提到的问题。我认为你没有增加数据库版本。或者这里的答案是直截了当的。我写这篇文章是因为它可能会帮助那些在更改表格时没有增加或更改数据库版本号的人。
答案 5 :(得分:3)
我认为我们不应该检查那样的条件
if (newVersion > oldVersion) {
}
因为如果我们使用它,这意味着每当我们增加数据库版本时,onUpdrade()将调用并且条件将为true,所以我们应该检查
if(oldVersion==1)
{
}
因此,在这种情况下,如果旧版本为2,则条件将为false,具有旧版本2的用户将不会更新数据库(用户仅需要版本1),因为对于那些用户数据库已经更新。
答案 6 :(得分:2)
我已经完成了以下方法,它已经为我恢复了
如果数据库版本: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);
}
其中:&#34; DATABASE_ALTER_ADD_PAPER_PAID&#34;是查询。
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
+ TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
完成上述两项操作后,它将适用于全新安装用户和应用升级用户
答案 7 :(得分:1)
要向表中添加新列,您需要使用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");
}
}
答案 8 :(得分:1)
只需更改代码
即可private final int DATABASE_VERSION = 1;
到
private static final int DATABASE_VERSION = 2;
答案 9 :(得分: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");
}
}
答案 10 :(得分:0)
首先,增加数据库版本号。然后在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();
}
}
此方法是从此链接Checking if a column exists in an application database in Android提取的
答案 11 :(得分:0)
注意到没有答案寻找列的存在:
Cursor cursor = database.rawQuery("SELECT * FROM " + MY_TABLE, null);
int columnIndex = cursor.getColumnIndex(MY_NEW_COLUMN);
if (columnIndex < 0) {
database.execSQL("ALTER TABLE " + MY_TABLE + " ADD COLUMN " + MY_NEW_COLUMN + " TEXT");
}