Android SQLite DB升级-代码结构(在onUpgrade中工作,但从那里调用时不起作用)

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调用

我正在android中升级sqlite数据库。我想我已经掌握了原则,但我无法理解类似代码版本的行为

当我在重写的onUpgrade过程(下面的代码1)中直接执行“altertable”命令时,一切都很好。如果我调用一个过程时使用完全相同的(sql和java)代码(代码2),那么数据库不会受到影响。但是,没有错误通知,如果我在使用adb拉取DB文件后在sqlite管理器中运行sql代码,它也可以正常工作

如果有人能解释一下“分离版本”的问题,那就太好了

注意:为了创建数据库,从onCreate调用例程没有问题

“集成”版本,代码1,工作:

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中执行时,它可以工作,但如果我从从那里调用的方法执行相同的命令,则不会工作。。。?