Android数据库版本控制

Android数据库版本控制,android,sqlite,versioning,upgrade,Android,Sqlite,Versioning,Upgrade,我希望每次更新应用程序时都清除应用程序的sqlite数据库。 为此,我在SQLiteDatabase的“onUpgrade”函数中对所有表进行了一次drop表查询 我有两个问题: -在我的应用程序第一次发布时,我没有做任何特殊的事情。 -在第二次启动时,我添加了一行“setVersion(2)”。它调用onUpgrade方法,但日志很奇怪: public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

我希望每次更新应用程序时都清除应用程序的sqlite数据库。 为此,我在SQLiteDatabase的“onUpgrade”函数中对所有表进行了一次drop表查询

我有两个问题: -在我的应用程序第一次发布时,我没有做任何特殊的事情。 -在第二次启动时,我添加了一行“setVersion(2)”。它调用onUpgrade方法,但日志很奇怪:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    Log.d("GDB", "onUpgrade "+oldVersion+" -> "+newVersion);
}
----------------------------------------------------------
DEBUG/GDB(5928): onUpgrade 2 -> 1
因此,当我创建一个setVersion()时,这两个版本似乎被切换了


我的第二个问题是,我第三次启动我的应用程序,没有更改代码(因此setVersion(2)已经在这里),再次调用onUpgrade方法!我是否错过了将版本最终设置为2的功能?

我认为不应该直接使用setVersion方法在代码中设置数据库的版本。相反,您应该将模式版本传递到SQLiteOpenHelper的构造函数中(或者至少传递给扩展它的类)。然后,您的onUpgrade方法应该包含条件语句,以根据用户从哪个版本升级来决定运行什么。这些条件应形成一个级联,以便来自低版本的数据按顺序应用所有数据库更新,以使用户达到当前级别。 因此,当您想要更改模式时,可以向onUpgrade添加一个新条件,并更新传递给构造函数的模式版本

这就是OpenHelper中的构造函数的外观:

public TiftHelper(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}
然后onUpgrade看起来像这样:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "on upgrade called. Old version:" + oldVersion
                + ". New version:" + newVersion);

        if (oldVersion == 19) {
            db.execSQL("create table challenges_temp as select * from challenges;");
            db.execSQL("drop table challenges;");
            db.execSQL(create_challenges);
            db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp");
            db.execSQL("drop table challenges_temp;");
        }
        if (oldVersion <= 20) {
            // adding the status column to the challenges table
            db.execSQL("create table challenges_temp as select * from challenges;");
            db.execSQL("drop table challenges;");
            db.execSQL(create_challenges);
            db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp");
            db.execSQL("drop table challenges_temp;");
        }
@覆盖
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
Log.d(标签“升级时调用.旧版本:”+oldVersion
+“.新版本:”+新版本);
如果(旧版本==19){
db.execSQL(“创建表挑战作为select*from challenges;”;
execSQL(“drop table challenges;”);
db.execSQL(创建_挑战);
db.execSQL(“插入挑战(_id,name,is_predef,status)从挑战中选择_id,name,is_predef,'IN_PROGRESS'”);
db.execSQL(“drop table challenges_temp;”);
}

if(oldVersion)查看定义数据库版本号的代码会很有帮助。是否发布数据库适配器的相关部分?只需一个setVersion(2),正如我所说,这是看到更多适配器的地方将是有用的。我认为您这样做是错误的,覆盖了初始DB版本而不是当前版本:SQLite似乎认为最初创建的版本是2,而事实并非如此。适配器是什么?SQLiteOpenHelper?是的,加上构造和使用它的代码。谢谢,它通过设置模式_VERSION而不是setVersion();)来工作