Création, lecture, modification, suppression
Maintenant que nous avons défini nos collections, apprenons à les manipuler!
Ouverture de Isar
Avant de pouvoir faire quoi que ce soit, nous avons besoin d'une instance Isar. Chaque instance nécessite un répertoire avec droits d'écriture où le fichier de la base de données peut être stocké. Si vous ne spécifiez pas de répertoire, Isar trouvera un répertoire par défaut selon la plateforme actuelle.
Fournissez tous les schémas que vous souhaitez utiliser avec l'instance Isar. Si nous ouvrons plusieurs instances, nous devons toujours fournir les mêmes schémas à chaque instance.
final dir = await getApplicationDocumentsDirectory();
final isar = await Isar.open(
[ContactSchema],
directory: dir.path,
);
Nous pouvons utiliser la configuration par défaut ou fournir certains des paramètres suivants:
Config | Description |
---|---|
name | Ouvrez plusieurs instances avec des noms distincts. Par défaut, "default" est utilisé. |
directory | L'emplacement de stockage de cette instance. Nous pouvons passer un chemin relatif ou absolu. Par défaut, NSDocumentDirectory est utilisé pour iOS et getDataDirectory pour Android. Non requis pour Web. |
relaxedDurability | Assouplit la garantie de durabilité pour augmenter les performances d'écriture. En cas de crash du système (pas de crash de l'application), il est possible de perdre la dernière transaction validée. La corruption n'est pas possible. |
compactOnLaunch | Conditions pour vérifier si la base de données doit être compactée lors de l'ouverture de l'instance. |
inspector | Active l'inspecteur en mode debug. Cette option est ignorée en mode profile et release. |
Si une instance est déjà ouverte, l'appel à Isar.open()
donnera l'instance existante sans tenir compte des paramètres spécifiés. Utile pour utiliser Isar dans un isolat.
Conseil
Envisagez d'utiliser le package path_provider pour obtenir un chemin valide sur toutes les plateformes.
L'emplacement de stockage du fichier de la base de données est répertoire/nom.isar
.
Lecture de la base de données
Utilisez les instances de IsarCollection
pour trouver, filtrer et créer de nouveaux objets d'un type donné dans Isar.
Pour les exemples ci-dessous, nous supposons que nous avons une collection Recipe
définie comme suit:
@collection
class Recipe {
Id? id;
String? name;
DateTime? lastCooked;
bool? isFavorite;
}
Obtenir une collection
Toutes nos collections vivent dans l'instance Isar. Nous pouvons obtenir la collection avec:
final recipes = isar.recipes;
N'oubliez pas d'importer les méthodes d'extension afin d'accéder à la collection depuis l'instance isar.
C'était facile! Si vous ne voulez pas utiliser les accesseurs de collection, vous pouvez aussi utiliser la méthode collection()
:
final recipes = isar.collection<Recipe>();
Obtenir un objet (par id)
Nous n'avons pas encore de données dans la collection, mais faisons comme si c'était le cas afin de récupérer un objet imaginaire avec l'identifiant 123
.
final recipe = await recipes.get(123);
get()
renvoie une Future
avec soit l'objet, soit null
s'il n'existe pas. Toutes les opérations d'Isar sont asynchrones par défaut, et la plupart d'entre elles ont un équivalent synchrone:
final recipe = recipes.getSync(123);
Avertissement
Vous devriez utiliser la version asynchrone des méthodes par défaut dans votre isolat d'interface utilisateur. Comme Isar est très rapide, il est souvent acceptable d'utiliser la version synchrone.
Si nous voulons récupérer plusieurs objets à la fois, nous pouvons utiliser getAll()
ou getAllSync()
:
final recipe = await recipes.getAll([1, 2]);
Recherche d'objets
Au lieu de récupérer les objets par leur identifiant, nous pouvons également obtenir une liste d'objets répondant à certaines conditions en utilisant .where()
et .filter()
:
final allRecipes = await recipes.where().findAll();
final favouires = await recipes.filter()
.isFavoriteEqualTo(true)
.findAll();
➡️ En savoir plus: Requêtes
Modifier la base de données
Il est enfin temps de modifier notre collection! Pour créer, mettre à jour ou supprimer des objets, utilisez les opérations respectives dans une transaction d'écriture:
await isar.writeTxn(() async {
final recipe = await recipes.get(123)
recipe.isFavorite = false;
await recipes.put(recipe); // Effectuer des opérations de mise à jour
await recipes.delete(123); // Ou des opérations de suppression
});
➡️ En savoir plus: Transactions
Insertion d'objets
Pour faire persister un objet dans Isar, insérons-le dans une collection. La méthode put()
d'Isar va soit insérer, soit mettre à jour l'objet selon s'il existe déjà dans la collection ou non.
Si le champ id est null
ou Isar.autoIncrement
, Isar utilisera un id auto-incrémenté.
final pancakes = Recipe()
..name = 'Pancakes'
..lastCooked = DateTime.now()
..isFavorite = true;
await isar.writeTxn(() async {
await recipes.put(pancakes);
})
Isar attribuera automatiquement l'id à l'objet si le champ id
est non final.
Il est tout aussi facile d'insérer plusieurs objets à la fois:
await isar.writeTxn(() async {
await recipes.putAll([pancakes, pizza]);
})
Mise à jour d'objets
La création et la mise à jour fonctionnent toutes deux avec collection.put(object)
. Si l'id est null
(ou n'existe pas), l'objet est créé; sinon, il est mis à jour.
Donc si nous voulons défavoriser nos crêpes, nous pouvons faire ce qui suit:
await isar.writeTxn(() async {
pancakes.isFavorite = false;
await recipes.put(pancakes);
});
Suppression d'objets
Vous voulez vous débarrasser d'un objet dans Isar ? Utilisez collection.delete(id)
. La méthode delete
retourne si un objet avec l'identifiant spécifié a été trouvé et supprimé. Si nous désirons supprimer l'objet avec l'identifiant 123
, par exemple, nous pouvons faire:
await isar.writeTxn(() async {
final success = await recipes.delete(123);
print('Recipe deleted: $success');
});
Comme pour les opérations get
et put
, il existe également une opération de suppression en vrac qui renvoie le nombre d'objets supprimés:
await isar.writeTxn(() async {
final count = await recipes.deleteAll([1, 2, 3]);
print('We deleted $count recipes');
});
Si nous ne connaissons pas les identifiants des objets que nous voulons supprimer, nous pouvons utiliser une requête:
await isar.writeTxn(() async {
final count = await recipes.filter()
.isFavoriteEqualTo(false)
.deleteAll();
print('We deleted $count recipes');
});