1

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

我遇到的困惑是我不希望用户在发生较小的 MySQL DB 更改时更新整个应用程序(更改项目统计信息、添加项目、添加角色或能力统计字符被调整)因为我在这里和 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()

4

2 回答 2

3

仅当表结构发生变化时,即添加或删除表或当某些列发生更改、添加或删除时,才会更改数据库版本。在这种情况下并且安装了新版本的应用程序时,Android 会检测到新的数据库版本并调用onUpgrade.

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

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

当这些不同时,您可以更新 MySQL 数据库中的数据。

更新

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

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

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

于 2013-03-25T19:48:58.067 回答
1

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

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

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

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

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

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

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

于 2013-03-25T19:58:52.867 回答