0

我的 Windows 应用程序的第一个版本(位于 Windows 商店)中有一个 SQLite 数据库。现在我想发布应用程序的第二个版本,其中还有一个 SQLite 数据库,其中添加了新表。我的数据保存在第一个版本中,不想丢失它们。我发现Android有处理 sqlite 数据库版本onCreateonUpgrade方法。Android:升级数据库版本并添加新表

类似的问题在这里。但这适用于 iOS。

Windows 运行时应用程序(Windows 8.1 和 Windows Phone 8.1)是否有类似的解决方案?请提出一些替代方案。

提前致谢。

4

2 回答 2

2

处理此类问题的一个好方法是在数据库中添加版本控制系统。在使用与数据库的连接之前,只需检查数据库中的应用程序版本,如果新版本高于以前的版本,则运行所有必要的命令来更新数据库。

前任:

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>();
}

谢谢,

于 2015-12-09T21:04:02.833 回答
1

拥有数据库版本的更好(性能)方法是使用“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;");
}
于 2015-12-10T14:59:28.680 回答