【发布时间】:2015-07-05 23:10:51
【问题描述】:
我目前在我的 Windows Phone 8.1 应用程序中使用带有 SQLite-NET 库的 SQLite 数据库。我想知道是否有人对在应用版本之间升级时如何完成表架构更改有任何最佳实践。
我唯一的选择是手动创建原始 SQL 语句来更新架构吗?
【问题讨论】:
我目前在我的 Windows Phone 8.1 应用程序中使用带有 SQLite-NET 库的 SQLite 数据库。我想知道是否有人对在应用版本之间升级时如何完成表架构更改有任何最佳实践。
我唯一的选择是手动创建原始 SQL 语句来更新架构吗?
【问题讨论】:
为了感谢 SO 社区,我提供了用于处理架构更改的主要代码。请注意,这将处理从任何早期版本到最新版本的数据库升级(即使用户跳过其间的版本)。不处理数据库降级。我可能应该多做一些错误检查 | try/catch 语句。
在我的 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;
}
【讨论】: