使用sqlite数据库和slite-net进行架构更改

时间:2014-07-25 19:46:03

标签: sqlite windows-phone-8.1

我目前在Windows Phone 8.1应用程序中使用带有SQLite-NET库的SQLite数据库。我想知道在应用程序版本之间升级时是否有人有关于如何完成表模式更改的最佳实践。

我唯一的选择是手动创建原始SQL语句来更新架构吗?

1 个答案:

答案 0 :(得分:4)

作为对SO社区的一点感谢,我提供了用于处理架构更改的主要代码。请注意,这将处理从任何早期版本到最新版本的数据库升级(即使用户跳过其间的版本)。不处理数据库降级。我应该多花一点时间检查错误尝试/捕获语句。

在我的sqlite帮助器类中,我有以下声明:

private SQLiteConnection _db;

// Start from 1 and increment this number whenever DB schema changes are made
private const int LATEST_DATABASE_VERSION = 3;

然后我的主要升级方法是:

private void DoUpgradeDb(int oldVersion, int newVersion)
        {
            for (int vFrom = oldVersion; vFrom < newVersion; vFrom++)
            {
                switch (vFrom)
                {
                    case 1: // Upgrade from v1 to v2
                        UpgradeV1AlterPersonAddColumnAge();
                        UpgradeV1AnotherSchemaChange();
                        break;
                    case 2: // Upgrade from v2 to v3
                        UpgradeV2CreateTableHobbies();
                        break;
                    default:
                        break;
                }
            }
            // Save the new version number to local storage
            App.AppSettingsService.SetDatabaseVersion(newVersion);
        }

如上所述,我希望将每个版本中的各个更改放入自己的方法中,因此我可以将UpgradeV2CreateTableHobbies()方法定义为:

    private void UpgradeV2CreateTableHobbies()
    {
        _db.CreateTable<Hobbies>();
    }

当然,您还需要记住在从头开始创建数据库时(例如新安装)进行相同的模式更改,而不仅仅是在更新时。

当需要进行下一次升级时,您可以增加LATEST_DATABASE_VERSION常量。我检查每次实例化我的Sqlite帮助程序类时是否需要版本升级(因为我使用单例模式),你可以做类似的事情:

    private bool UpgradeDbIfRequired()
    {
        bool wasUpgradeApplied = false;
        // I wrote a GetDatabaseVersion helper method that reads the version (as nullable int) from local app settings.
        int? currentVersion = App.AppSettingsService.GetDatabaseVersion();
        if (currentVersion.HasValue && currentVersion.Value < LATEST_DATABASE_VERSION)
        {
                // Upgrade to latest version
                DoUpgradeDb(currentVersion.Value, LATEST_DATABASE_VERSION);
                wasUpgradeApplied = true;
        }
        else
        {
            // Already on latest version
            return false;
        }

        return wasUpgradeApplied;
    }