2013-03-25 62 views
1

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

我遇到的困惑是我不希望用户在发生次要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)我可以直接打电话升级(db,oldVersion,newVersion),并把我想要的参数,或者这是一个非常坏的主意,它应该通过getWritableDatabase()处理?

+0

有[SQLiteDatabase#setVersion(int)](https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setVersion%28int%29),但不应该联合使用用'SQLiteOpenHelper' – zapl 2013-03-25 20:01:45

回答

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(),因为您已经创建了自己的版本控制代码。

3

数据库版本仅改变时,当表结构发生了变化,添加即表或删除,或者当某些列改变,添加或删除。当出现这种情况并安装了新版应用程序时,Android会检测到新的数据库版本并呼叫onUpgrade

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

在你的情况,你可以添加一些序列号或时间戳列中的,用于识别当前数据的版本之一和比较,对版本或时间戳存储在相应的SQLite数据库表。

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

更新

当你更新你的应用程序,但表结构是不变的,则数据库版本应该保持不变,数据库及其数据保持不变。

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

这一切都是独立于日常更新,当您的应用程序运行并从主服务器数据库中拉出当前的数据。

+0

好吧,我想我开始明白了。说我用一些表填充sqlite数据库,并填充表中的信息,如果用户退出应用程序,并返回将信息仍然在表中?我知道桌子呆在那里,但是居住在他们那里的信息也保持不变?如果是这样,当游戏本身有更新时我需要重新填充它们。因为除非游戏本身具有更新并且API在MySQL内部加载不同的数据,否则表格不会被更改。 – JoeyL 2013-03-25 22:25:53

+0

@JoeyL请参阅更新的答案。 – 2013-03-25 23:20:29