Windows 运行时应用程序:升级 SQLite 数据库并添加新的 table
Windows Runtime Apps: Upgrading SQLite database and adding a new table
我的 Windows 应用程序(在 Windows 商店)的第一个版本中有一个 SQLite 数据库。现在我想发布应用程序的第二个版本,其中也有一个添加了新表的 SQLite 数据库。
我的数据保存在第一个版本中,不想丢失它们。
我发现 Android 有 onCreate
和 onUpgrade
方法来处理 sqlite 数据库版本。 Android: upgrading DB version and adding new table。
类似的问题是here。但那是 iOS.
Windows 运行时应用程序(Windows 8.1 和 Windows Phone 8.1)是否有类似的解决方案?请提出一些替代方案。
提前致谢。
处理此类问题的一个好方法是在数据库中添加一个版本控制系统。
在使用数据库连接之前,只需检查数据库中的应用程序版本,如果新版本高于之前的版本,运行 更新数据库所需的所有命令。
例如:
public async Task<SQLite.SQLiteConnection> GetSqliteConnectionForUserAsync(string login)
{
using (await _mutex.LockAsync())
{
if (login == null)
{
login = "__anonymous__";
}
SQLite.SQLiteConnection conn;
if (!_userConnections.TryGetValue(login, out conn))
{
conn = new SQLite.SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path,
string.Format("{0}.db", Uri.EscapeDataString(login))));
await SqlSchemaHandler.EnsureSchemaReadyAsync(conn, s =>
{
_logger.Info("Schema handler message : {0}", s);
});
_userConnections[login] = conn;
}
return conn;
}
}
和(SqlSchemaHandler):
public static Task EnsureSchemaReadyAsync(SQLiteConnection connection, Action<string> actionReporter)
{
return Task.Run(() =>
{
connection.CreateTable<SchemaInfo>();
var schemaInfo = connection.Table<SchemaInfo>().FirstOrDefault();
if (schemaInfo == null)
{
ApplyV0ToV1(connection);
schemaInfo = new SchemaInfo { Id = 1, Version = 1 };
connection.Insert(schemaInfo);
}
});
}
private static void ApplyV0ToV1(SQLiteConnection connection)
{
connection.CreateTable<Test>();
}
谢谢,
获得数据库版本的更好(为了性能)方法是使用 "PRAGMA user_version"
var sqLiteAsyncConnection = new SQLiteAsyncConnection(path);
// read the user version
var version = sqLiteAsyncConnection.ExecuteScalar<string>("PRAGMA user_version");
perfMon.TraceSinceLast("StandardQueryBase : db version read");
if (version == "0")
{
// update the schema here
// store the new version number in the DB
sqLiteAsyncConnection.ExecuteScalar<string>("PRAGMA user_version=1;");
}
我的 Windows 应用程序(在 Windows 商店)的第一个版本中有一个 SQLite 数据库。现在我想发布应用程序的第二个版本,其中也有一个添加了新表的 SQLite 数据库。
我的数据保存在第一个版本中,不想丢失它们。
我发现 Android 有 onCreate
和 onUpgrade
方法来处理 sqlite 数据库版本。 Android: upgrading DB version and adding new table。
类似的问题是here。但那是 iOS.
Windows 运行时应用程序(Windows 8.1 和 Windows Phone 8.1)是否有类似的解决方案?请提出一些替代方案。
提前致谢。
处理此类问题的一个好方法是在数据库中添加一个版本控制系统。 在使用数据库连接之前,只需检查数据库中的应用程序版本,如果新版本高于之前的版本,运行 更新数据库所需的所有命令。
例如:
public async Task<SQLite.SQLiteConnection> GetSqliteConnectionForUserAsync(string login)
{
using (await _mutex.LockAsync())
{
if (login == null)
{
login = "__anonymous__";
}
SQLite.SQLiteConnection conn;
if (!_userConnections.TryGetValue(login, out conn))
{
conn = new SQLite.SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path,
string.Format("{0}.db", Uri.EscapeDataString(login))));
await SqlSchemaHandler.EnsureSchemaReadyAsync(conn, s =>
{
_logger.Info("Schema handler message : {0}", s);
});
_userConnections[login] = conn;
}
return conn;
}
}
和(SqlSchemaHandler):
public static Task EnsureSchemaReadyAsync(SQLiteConnection connection, Action<string> actionReporter)
{
return Task.Run(() =>
{
connection.CreateTable<SchemaInfo>();
var schemaInfo = connection.Table<SchemaInfo>().FirstOrDefault();
if (schemaInfo == null)
{
ApplyV0ToV1(connection);
schemaInfo = new SchemaInfo { Id = 1, Version = 1 };
connection.Insert(schemaInfo);
}
});
}
private static void ApplyV0ToV1(SQLiteConnection connection)
{
connection.CreateTable<Test>();
}
谢谢,
获得数据库版本的更好(为了性能)方法是使用 "PRAGMA user_version"
var sqLiteAsyncConnection = new SQLiteAsyncConnection(path);
// read the user version
var version = sqLiteAsyncConnection.ExecuteScalar<string>("PRAGMA user_version");
perfMon.TraceSinceLast("StandardQueryBase : db version read");
if (version == "0")
{
// update the schema here
// store the new version number in the DB
sqLiteAsyncConnection.ExecuteScalar<string>("PRAGMA user_version=1;");
}