0

У меня есть база данных SQLite в первой версии моего приложения Windows (которое находится в хранилище Windows). Теперь я хочу выпустить вторую версию приложения, в которой также есть база данных SQLite с добавленными новыми таблицами. У меня мои данные сохранены в первой версии и не хотят их потерять. Я обнаружил, что Android имеет onCreate и onUpgrade методы обработки SQL-версий базы данных. Android: upgrading DB version and adding new table.Windows Runtime Apps: Обновление базы данных SQLite и добавление новой таблицы

Аналогичный вопрос: here. Но это для iOS.

Есть ли подобные решения для Windows Runtime Apps (Windows 8.1 и Windows Phone 8.1)? Пожалуйста, предложите несколько альтернатив.

Заранее спасибо.

+0

Возможный дубликат [Обновление базы данных при обновлении приложения] (http://stackoverflow.com/questions/15703352/upgrading-database-on-app-update) –

ответ

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;"); 
} 
+1

Спасибо @ Jmix90. Это хорошо для производительности и закончилось вашим ответом. Еще раз спасибо :) –

2

Хороший способ справиться с этой проблемой - это добавить систему версий в базу данных. Прежде чем использовать соединение с базой данных, просто проверьте версию приложения в базе данных и, если новая версия выше предыдущей, запустите все необходимые команды для обновления базы данных.

Ex:

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

Спасибо,

+0

Спасибо за ваше предложение! Оцените свои усилия. Да, это лучшая идея. @Thomas LEBRUN –