2011-08-29 115 views
1

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

我有两个问题: - 在我的应用程序首次发布时,我没有做任何特殊的事情。 - 在第二次启动时,我添加了一个“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(),2个版本似乎切换.....

我的第二个问题是,是我第三次启动我的应用程序,而不更改代码(所以setVersion(2)已经在这里),onUpgrade方法再次被调用!我是否错过了将版本确定为2的内容?

+0

查看定义数据库版本号的代码会很有帮助。你会发布你的数据库适配器的相关部分吗? – Shlublu

+0

只是一个setVersion(2),正如我所说的 – Imotep

+0

这是看到更多的适配器将会有用的地方。我认为你做错了,通过覆盖最初的数据库版本而不是现在的版本:似乎SQLite认为最初创建的版本是2,事实并非如此。 – Shlublu

回答

3

我不认为你应该直接使用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;"); 
     } 

这对我来说工作正常。

+0

谢谢,它通过设置SCHEMA_VERSION而不是setVersion();) – Imotep