【问题标题】:onUpgrade() sqlite database in AndroidAndroid 中的 onUpgrade() sqlite 数据库
【发布时间】:2012-10-31 13:33:55
【问题描述】:

我创建了一个 Android 应用程序,在启动时检查是否有新版本的应用程序。如果是,则应用程序下载新的 apk 文件并过度安装新的 apk。 我的应用程序使用 sqlite 数据库。但是这个数据库,从一个版本到另一个版本可以改变。 我想我必须使用方法:

 onUpgrade()

但我不知道具体怎么用。

当我启动应用程序时,我将此代码用于 crete 数据库(如果不存在):

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION)

如果我想使用onUpgrade() 方法,我应该改变什么? 我什么时候必须调用它?

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    onUpgrade() 在您的数据库版本发生更改时被调用(您自己不会调用它),这意味着基础表结构发生更改等。

    一般来说,这意味着操作系统告诉你“嘿,你要求数据库结构版本 10,但我发现我们这里有一些旧的东西,所以这是你在开始使用数据库之前修复它的机会(并且可能由于结构不匹配而崩溃)”.

    在这种方法中,您应该做所有必要的事情,嗯.. 升级旧数据库的结构以匹配当前版本要求的结构,例如添加/删除列、转换行内容甚至完全删除旧数据库并从头开始创建它- 对于 Android,你在这里做什么并不重要 - 这只是一种紧急回调,让你的代码完成必要的工作(如果有的话)。您需要注意用户可能不会经常更新,因此您必须始终处理从版本 X 升级到 Y 的操作,因为您知道 X 可能不等于即 (Y-1)。

    【讨论】:

    • 我注意到 onUpgrade 有两个 int 参数:oldVersion 和 newVersion。因此,如果我的应用程序中有版本 1 的数据库并且下载的 apk 包含版本 2 的数据库,这允许系统自动调用 onUpgrade() 方法吗?
    • 就像code.google.com/p/openintents/source/browse/trunk/notepad/… 中建议的那样,我可以使用 switch(oldVersion) 来考虑对每个旧版本进行的不同更改?这是正确的吗?此外,如果在新的数据库版本中,我将新列添加到某个表中,我还必须修改 onCreate,以便使用新的附加列创建表?如果尚未安装应用程序并且必须创建新数据库,这可能是有意义的。我的假设正确吗?
    • 是的。版本号只是int,所以你可以做常规的switch/case。重要的是,例如,您应该处理从版本 2 升级到 3 以及从 1 升级到 3(我可能只是循环到那里,首先从 1 升级到 2,然后从 2 升级到 3),这可能比处理从 1 到 3 的直接更新(或从 1 到 80 以提供更广泛的视角)更简单
    【解决方案2】:

    如果您使用的是 SQLiteOpenHelper,则无论何时更改数据库版本都会调用 onUpgrade。 有一个额外的要求才能工作。数据库名称必须保持不变。

    Old Version:
    dbName = "mydb.db"
    dbVersion = 1
    
    New Version:
    dbName = "mydb.db"
    dbVersion = 2
    

    在内容提供者的 onCreate 中,您创建一个接受这些参数的 SQLiteOpenHelper 实例。您的 SQLiteOpenHelper 实现如下所示:

    public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {
    
            public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
                super(context, dbName, null, dbVersion);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                //Code to create your db here
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // Code to upgrade your db here
            }
    
    }
    

    当您更改表或在数据库中添加更多表时也会调用它

    【讨论】:

      【解决方案3】:

      我发现这很有帮助 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          if (oldVersion < 2) {
               db.execSQL(DATABASE_ALTER_TEAM_1);
          }
          if (oldVersion < 3) {
               db.execSQL(DATABASE_ALTER_TEAM_2);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 2012-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多