0

J'ai une base de données SQLite dans la première version de mon application Windows (qui se trouve dans le Windows Store). Maintenant je veux libérer la deuxième version de l'application, qui a également une base de données SQLite avec de nouvelles tables ajoutées. J'ai mes données enregistrées dans la première version et je ne veux pas les perdre. J'ai trouvé que Android a onCreate et onUpgrade méthodes pour gérer les versions de base de données sqlite. Android: upgrading DB version and adding new table.Windows Runtime Apps: Mise à niveau de la base de données SQLite et ajout d'une nouvelle table

La question similaire est here. Mais c'est pour iOS.

Existe-t-il des solutions similaires pour Windows Runtime Apps (Windows 8.1 et Windows Phone 8.1)? S'il vous plaît suggérer des alternatives.

Merci d'avance.

+0

Possible copie de [Mise à jour de la base de données sur la mise à jour de l'application] (http://stackoverflow.com/questions/15703352/upgrading-database-on-app-update) –

Répondre

1

Une meilleure (pour la performance) façon d'avoir une version de la DB est d'utiliser le "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

Merci @ Jmix90. C'est bon pour la performance et fini avec votre réponse. Merci encore :) –

2

Un bon moyen de gérer ce type de problème consiste à ajouter un système de gestion des versions dans la base de données. Avant d'utiliser la connexion à la base de données, vérifiez simplement la version de l'application dans la base de données et, si la nouvelle version est supérieure à la précédente, exécutez toutes les commandes nécessaires pour mettre à jour votre base de données.

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

}

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

Merci,

+0

Merci pour votre suggestion! Apprécier votre effort. Oui c'est une meilleure idée. @Thomas LEBRUN –