调用sqlite onUpgrade问题

时间:2013-03-25 19:44:02

标签: java android sqlite

我有2个数据库。 1是MySQL,我使用游戏API来收集有关游戏的最新信息。我拥有的另一个数据库是我在我的应用程序中创建的sqlite数据库(两者都有相同的表和列)。我希望如何工作,应用程序启动然后将检查MySQL版本(每当我玩的游戏有更新时更新)我检查MySQL版本是否与sqlite版本匹配并在需要时更新。

我遇到的困惑是我不希望用户在发生次要MySQL数据库更改时必须更新整个应用程序(项目状态变更,项目被添加,角色被添加或者统计数据角色的能力得到调整),因为我在这里和Vogella教程中看到的是,我似乎需要手动更改:

private static final int DATABASE_VERSION = 1;  //<<<<<Manually change this
...

public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

这违背了我想要达到的目的。

1)有没有办法更新DATABASE_VERSION而不必在代码中手动更改它?

2)可我只是直出调用onUpgrade(DB,oldVersion,NEWVERSION),把我想要的参数或者这是一个非常糟糕的主意,它应该通过处理getWritableDatabase()

2 个答案:

答案 0 :(得分:3)

仅在表结构发生更改时更改数据库版本,即添加或删除表,或者添加或删除某些列。如果是这种情况并且安装了新版本的应用,则Android会检测新的数据库版本并调用onUpgrade

如果只更新表中的数据,表结构没有变化,因此无需增加数据库版本号。

在您的情况下,您可以在其中一列中添加一些序列号或时间戳,这些列标识当前数据版本并将其与存储在相应SQLite数据库表中的版本或时间戳进行比较。

如果这些不同,您可以从MySQL数据库更新数据。

<强>更新

当您更新应用程序但表格结构未更改时,数据库版本应保持不变,数据库及其数据保持不变。

更新应用程序并更改表结构时,会增加数据库版本号。 Android会比较当前版本和新版本并调用onUpgrade。现在,您可以执行必要的步骤来升级数据库,更改数据库布局,填充新表或列,以及需要执行的任何操作。您甚至可以从头开始销毁所有内容并构建新的数据库。

当您的应用运行并从主服务器数据库中提取当前数据时,所有这些都与日常更新无关。

答案 1 :(得分:1)

听起来您正在从中央MySQL数据库中读取您的架构,只是在Android设备上保留本地副本。当您更改中央数据库的架构时,是的,手动更改本地副本是愚蠢的。

  

1)有没有办法更新DATABASE_VERSION而不必在代码中手动更改它?

DATABASE_VERSION就像任何其他变量一样,如果你想从外部源控制它的值,你可以。老实说,你甚至不需要这个变量,它只在SQLiteOpenHelper的constructors中使用:

SQLiteOpenHelper(Context context, String name, 
        SQLiteDatabase.CursorFactory factory, int version)

SQLiteDatabase维护它自己的私有版本号。

  

2)我可以直接调用onUpgrade(db,oldVersion,newVersion)......?

我不建议这样做,因为您不会更改内部版本号并跳过SQLiteOpenHelper使用的其他内部检查。
是的,您可以手动执行许多这些检查,但是对于您创建的每个解决方法,您都会使SQLiteOpenHelper变得不那么有用。在某些时候,您最好直接调用Context#openOrCreateDatabase(),因为您已经创建了自己的版本控制代码。