Android SQLite DB升级-代码结构(在onUpgrade中工作,但从那里调用时不起作用)
我正在android中升级sqlite数据库。我想我已经掌握了原则,但我无法理解类似代码版本的行为 当我在重写的onUpgrade过程(下面的代码1)中直接执行“altertable”命令时,一切都很好。如果我调用一个过程时使用完全相同的(sql和java)代码(代码2),那么数据库不会受到影响。但是,没有错误通知,如果我在使用adb拉取DB文件后在sqlite管理器中运行sql代码,它也可以正常工作 如果有人能解释一下“分离版本”的问题,那就太好了 注意:为了创建数据库,从onCreate调用例程没有问题 “集成”版本,代码1,工作:Android SQLite DB升级-代码结构(在onUpgrade中工作,但从那里调用时不起作用),android,database,sqlite,upgrade,alter-table,Android,Database,Sqlite,Upgrade,Alter Table,我正在android中升级sqlite数据库。我想我已经掌握了原则,但我无法理解类似代码版本的行为 当我在重写的onUpgrade过程(下面的代码1)中直接执行“altertable”命令时,一切都很好。如果我调用一个过程时使用完全相同的(sql和java)代码(代码2),那么数据库不会受到影响。但是,没有错误通知,如果我在使用adb拉取DB文件后在sqlite管理器中运行sql代码,它也可以正常工作 如果有人能解释一下“分离版本”的问题,那就太好了 注意:为了创建数据库,从onCreate调用
public class DBHandler extends SQLiteOpenHelper {
private static final String DBName = "DynamicValueTracker.db";
private static final int DBVersion = 2;
public DBHandler(Context context) {
super(context, DBName, null, DBVersion);
mContext = context;
}
@Override
public void onUpgrade(SQLiteDatabase db, int OldVersion, int NewVersion) {
switch (NewVersion) {
//(deleted further cases for posting question...)
//This works
case 2:
String sqlcmd = "ALTER TABLE countries ADD COLUMN capital TEXT DEFAULT null;";
db.execSQL(sqlcmd);
break;
}
}
}
“分离”版本,代码2,不工作:
public class DBHandler extends SQLiteOpenHelper {
private static final String DBName = "DynamicValueTracker.db";
private static final int DBVersion = 2;
public DBHandler(Context context) {
super(context, DBName, null, DBVersion);
mContext = context;
}
@Override
public void onUpgrade(SQLiteDatabase db, int OldVersion, int NewVersion) {
switch (NewVersion) {
//(deleted further cases for posting question...)
case 2:
DBUpgrade_V1_to_V2(db);
break;
}
}
}
public void DBUpgrade_V1_to_V2(SQLiteDatabase db) {
//This is excecuted without throwing errors but does not change the database table
String sqlcmd = "ALTER TABLE countries ADD COLUMN capital TEXT DEFAULT null;";
db.execSQL(sqlcmd);
}
}确认-您已将代码还原到版本1,卸载了应用程序,重新安装,添加了修改后的版本2代码,然后再次运行?是的,我这样做了。我还复制了不同版本的行为,将v1升级到v2、v1升级到v3、v2升级到v3等等。。。(我在这里只发布了一个简短的代码版本)并且在删除数据库之后,对于从重写的onCreate调用的每个版本,总是从一个不同的过程运行正确版本的onCreate…好的,只是想排除这一点,因为每个数据库版本最多只调用一次onUpgrade(注意,您还应该考虑从版本1到版本3的可能性,并且您可能仍然需要为中间版本2运行一些查询)。非常奇怪的是,如果您从v1升级到v2,您的升级方法没有被调用。我想这更奇怪-它被调用了,但没有任何效果!当SQL命令直接在onUpgrade中执行时,它可以工作,但如果我从从那里调用的方法执行相同的命令,则不会工作。。。?