Utiliser SQLite de façon asynchrone

Effectué

Si vous exécutez des requêtes sur une base de données de façon synchrone, vous pouvez rencontrer des problèmes de performances et des applications non réactives. SQLite-net a une API asynchrone que vous pouvez utiliser pour maintenir votre application réactive.

Dans cette unité, vous allez découvrir comment utiliser l’API asynchrone SQLite-net pour garantir que votre application reste très réactive.

Comprendre les requêtes asynchrones

Jusqu’à présent, tout ce que vous avez fait a été exécuté sur le thread d’interface utilisateur. Cependant, pour créer une application mobile très réactive, vous voulez faire les choses un peu différemment. Si vous effectuez des opérations de base de données sur le thread d’interface utilisateur, l’interface utilisateur peut se figer si l’opération prend beaucoup de temps.

Pour résoudre ce problème, SQLite-net contient une API asynchrone par la classe SQLiteAsyncConnection. Par exemple, pour créer une table de façon asynchrone, vous pouvez utiliser la méthode CreateTableAsync :

var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();

Effectuer des opérations asynchrones avec SQLite-net

La classe SQLiteAsyncConnection expose des opérations semblables à celles de son équivalent synchrone. Cependant, les opérations sont toutes basées sur des tâches pour l’utilisation en arrière-plan.

Les opérations asynchrones courantes disponibles sont les suivantes :

  • CreateTableAsync : Crée une table basée sur la classe indiquée.

  • DropTableAsync : Supprime la table qui correspond à la classe indiquée.

  • GetAsync : Obtient l’enregistrement de la table qui correspond à la classe indiquée et établit une correspondance avec la clé primaire passée au constructeur.

  • InsertAsync : Insère un nouvel enregistrement en utilisant l’élément qui est passé au constructeur.

  • UpdateAsync : Met à jour un enregistrement existant en utilisant l’élément qui est passé au constructeur.

  • DeleteAsync : Supprime l’enregistrement de la table qui est mappée à la classe indiquée et établit une correspondance avec la clé primaire passée au constructeur.

  • QueryAsync : Exécute une requête SQL directe et retourne un objet.

  • ExecuteAsync : Exécute une requête SQL directe et retourne le nombre de lignes affectées

  • ExecuteScalarAsync : Exécute une requête SQL directe et retourne le résultat unique.

  • ToListAsync : Exécute la méthode Table de façon asynchrone

Le code suivant montre un exemple d’utilisation de la méthode ToListAsync pour récupérer des enregistrements de façon asynchrone :

SQLiteAsyncConnection conn;
ObservableCollection<User> userList;  // Bound to UI
...
public async Task AddAllUsersAsync()
{
    List<User> users = await conn.Table<User>().ToListAsync();
    // Must be on UI thread here!
    foreach (var u in users)
        userList.Add(u);
}

Dans cet exemple, la méthode ToListAsync extrait de façon asynchrone tous les utilisateurs de la base de données. Si vous utilisez cette méthode, votre interface utilisateur reste réactive, même s’il existe un grand ensemble d’utilisateurs dans la base de données.