为了账号安全,请及时绑定邮箱和手机立即绑定

Android:升级数据库版本并添加新表

Android:升级数据库版本并添加新表

偶然的你 2019-08-06 13:06:06
Android:升级数据库版本并添加新表我已经为我的应用程序创建了sqlite表,但现在我想在数据库中添加一个新表。我更改了DB版本如下private static final int DATABASE_VERSION = 2;并添加字符串以创建表private static final String DATABASE_CREATE_color =     "CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";onCreate并且onUpgrade,如下:@Override    public void onCreate(SQLiteDatabase database) {         database.execSQL(DATABASE_CREATE_incident);         database.execSQL(DATABASE_CREATE_audio);         database.execSQL(DATABASE_CREATE_video);         database.execSQL(DATABASE_CREATE_image);     }     @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {         //drop table and add new tables when version 2 released.         db.execSQL(DATABASE_CREATE_color);     }但由于某种原因,没有创建新表。我究竟做错了什么?
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

1.关于onCreate()和onUpgrade()

onCreate(..)每当应用程序刚刚安装时调用。 onUpgrade每当升级和启动应用程序并且数据库版本不同时调用。

2.增加db版本

你需要一个像这样的构造函数:

MyOpenHelper(Context context) {
   super(context, "dbname", null, 2); // 2 is the database version}

重要提示:单独增加应用程序版本是不够的onUpgrade

3.不要忘记你的新用户!

别忘了添加

database.execSQL(DATABASE_CREATE_color);

您的onCreate()方法或新安装的应用程序将缺少该表。

4.如何处理多个数据库随时间的变化

如果您有连续的应用程序升级,其中有几个已进行数据库升级,您需要确保检查oldVersion

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   switch(oldVersion) {
   case 1:
       db.execSQL(DATABASE_CREATE_color);
       // we want both updates, so no break statement here...
   case 2:
       db.execSQL(DATABASE_CREATE_someothertable); 
   }}

这样,当用户从版本1升级到版本3时,他们将获得两个更新。当用户从版本2升级到3时,他们只会获得版本3更新...毕竟,每次发布更新时,都不能指望100%的用户群升级。有时他们会跳过更新或12 :)

5.在开发过程中保持您的版本号控制

最后......打电话

adb uninstall <yourpackagename>

完全卸载应用程序。当你再次安装时,你可以保证在开发时onCreate不必将数据库版本增加到平流层......


查看完整回答
反对 回复 2019-08-06
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您的代码看起来正确。我的建议是数据库已经认为它已经升级了。如果在增加版本号后执行项目,但在添加execSQL调用之前,测试设备/模拟器上的数据库可能已经相信它在版本2中。

验证这一点的一种快速方法是将版本号更改为3 - 如果在此之后升级,您知道这只是因为您的设备认为它已经升级。


查看完整回答
反对 回复 2019-08-06
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

您可以使用SQLiteOpenHelper的onUpgrade方法。在onUpgrade方法中,您将oldVersion作为参数之一。

onUpgrade使用a switch和每个cases中使用版本号来跟踪当前版本的数据库。

这是最好的,你从遍历oldVersionnewVersion,增加version在时间1,然后再升级一步数据库的一步。当数据库版本1的人在很长一段时间后将应用程序升级到使用数据库版本7的版本并且应用程序因某些不兼容的更改而开始崩溃时,这非常有用。

然后,数据库中的更新将逐步完成,涵盖所有可能的情况,即合并为每个新版本完成的数据库更改,从而防止应用程序崩溃。

例如:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
    case 1:
        String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " + "name_of_column_to_be_added" + " INTEGER";
        db.execSQL(sql);
        break;

    case 2:
        String sql = "SOME_QUERY";
        db.execSQL(sql);
        break;
    }}


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 856 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信