【问题标题】:Handling multiple upgrades of SqLite in Android (ALTER vs. CREATE)在 Android 中处理 SqlLite 的多次升级(ALTER 与 CREATE)
【发布时间】:2016-03-13 05:25:11
【问题描述】:

当增加版本号时,会为 SQLite 调用 onUpgrade(),因此通常会有一个 create-table SQL 语句和一个 alter-table SQL 语句。

如果已经有多个版本,是否需要声明多个alter-table语句?

【问题讨论】:

    标签: android sqlite android-studio


    【解决方案1】:

    onUpgrade 为您提供旧版本和新版本,您可以做任何您需要做的事情。这是一种方法:http://blog.adamsbros.org/2012/02/28/upgrade-android-sqlite-database/

        public void onUpgrade(
        final SQLiteDatabase db, final int oldVersion,
        final int newVersion)
    {
        int upgradeTo = oldVersion + 1;
        while (upgradeTo <= newVersion)
        {
            switch (upgradeTo)
            {
                case 5:
                    db.execSQL(SQLiteSet.V5_ADD_LAST_CARD);
                    db.execSQL(SQLiteCard.V5_ADD_FAILED);
                    break;
                case 6:
                    db.execSQL(SQLiteSet.V6_ADD_IMPORT_TYPE);
                    break;
                case 7:
                    db.execSQL(SQLiteSet.V7_ADD_SHORT_FNAME);
                    break;
            }
            upgradeTo++;
        }
    }
    

    【讨论】:

    • 我只是在大声思考,但在实践中,如果表很大,这样会在数据库上执行几个增量执行吗?或者这些变化可以忽略不计
    • 这取决于你在做什么。我认为无论如何添加列都会很便宜,但是如果您正在重建索引或其他东西,可能会对性能产生影响。我的猜测是,在大多数情况下,无论是一次升级还是以某种方式批量升级都不会产生显着差异,如果一次完成所有升级,您的代码可能会更复杂,因为您需要涵盖所有可能单独升级。 1->2, 1->3, 1-4, 2->3, 2->4 等。随着时间的推移,情况会变得更糟。
    【解决方案2】:

    是的,您可能需要从任何给定版本号到当前版本的升级路径。 onUpgrade() 为您提供了一种方法,因为它为您提供了旧版本号,您可以使用它来确定要执行哪些迁移以升级到当前版本。

    【讨论】:

    • 新版本号也被传入有什么原因吗?这不与传递给构造函数中的 super() 调用的 DB_VERSION 参数相同吗?这真的在升级方法中使用过吗?
    • 您通常不需要对新版本号进行任何操作。如果需要,您可以使用它。如果以某种方式发生配置更改以恢复最高数量的更改,则可能很重要,然后需要进行后续升级以仅执行到某个版本。应用程序没有义务始终尽可能升级 - 它可能以其他条件为条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多