Erstellen, Lesen, Aktualisieren und Löschen

Lerne wie du Collections in Isar nutzt nachdem du sie definiert hast.

Öffnen von Isar

Als Erstes benötigen wir eine Isar Instanz. Jede Instanz erfordert einen Ordner mit Schreibrechten, in dem die Datenbankdatei gespeichert werden kann. Wenn du keinen Ordner angibst, wird Isar einen geeigneten Standardordner für die aktuelle Plattform finden.

Gib alle Schemas an, die du mit der Isar-Instanz verwenden möchtest. Wenn du mehrere Instanzen öffnest, musst du trotzdem jeder Instanz die gleichen Schemas mitgeben.

final dir = await getApplicationDocumentsDirectory();
final isar = await Isar.openAsync(
  schemas: [RecipeSchema],
  directory: dir.path,
);

Du kannst die Standardkonfiguration verwenden oder einige der folgenden Parameter setzen:

KonfigurationBeschreibung
nameÖffne mehrere Instanzen mit unterschiedlichen Namen. Standardmäßig wird "default" verwendet.
directoryDer Speicherort für diese Instanz. Standardmäßig wird NSDocumentDirectory für iOS und getDataDirectory für Android verwendet. Nicht erforderlich für Web.
relaxedDurabilityEntspannt die durability-Garantie, um die Schreibleistung zu erhöhen. Im Falle eines Systemabsturzes (nicht App-Absturz) ist es möglich, die letzte Transaktion zu verlieren. Datenbankkorruption ist nicht möglich

Wenn eine Instanz bereits geöffnet ist, wird Isar.open() die vorhandene Instanz unabhängig von den angegebenen Parametern zurückgeben. Das ist nützlich, um Isar in einem Isolate zu verwenden.

Tipp

Verwende das path_provideropen in new window-Paket, um einen gültigen Pfad auf allen Plattformen zu erhalten.

Der Speicherort der Datenbankdatei ist directory/name.isar

Aus der Datenbank lesen

Verwende IsarCollection-Instanzen um Objekte eines bestimmten Typs in Isar zu finden, abzufragen und neu zu erstellen.

Den folgenden Beispielen liegt die Collection Recipe zugrunde, die wie folgt definiert ist:

@collection
class Recipe {
  late int id;

  String? name;

  DateTime? lastCooked;

  bool? isFavorite;
}

Eine Collection erhalten

Alle deine Collections befinden sich in der Isar Instanz. Erhalte die Recipes-Collection über den Accessor:

final recipes = isar.recipes;

Objekt abrufen (per ID)

Wir haben noch keine Daten in der Collection, aber wir nehmen an, dass bereits ein Objekt mit der ID 123 existiert.

final recipe = await isar.recipes.getAsync(123);

Die getAsync()-Methode gibt ein Future zurück, das entweder das Objekt enthält, oder null, wenn die ID nicht existiert. Alle Isar-Operationen sind standardmäßig asynchron, auch wenn die meisten ein synchrones Gegenstück haben:

final recipe = recipes.get(123);

Warnung

Normalerweise solltest du die asynchrone Version der Methoden in deinem UI-Isolate bevorzugen. Da Isar sehr schnell ist, sind die synchronen Methoden oft auch in Ordnung.

Wenn du mehrere Objekte auf einmal abrufen möchtest, kannst du getAll() oder getAllSync() verwenden:

final recipe = await isar.recipes.getAll([1, 2]);

Abfragen von Objekten

Anstatt Objekte über die ID zu erhalten, kannst du mittels .where() und .filter() auch eine Liste von Objekten abfragen, die bestimmten Bedingungen entsprechen:

final allRecipes = await isar.recipes.where().findAll();

final favourites = await isar.recipes.filter()
  .isFavoriteEqualTo(true)
  .findAll();

➡️ Lerne mehr: Abfragen

Ändern der Datenbank

Jetzt ist es endlich an der Zeit, unsere Collection zu verändern! Um Objekte zu erstellen, zu aktualisieren oder zu löschen, rufe die entsprechenden Operationen innerhalb einer Schreibtransaktion auf:

await isar.writeAsync((isar) async {
  final recipe = await isar.recipes.getAsync(123)

  recipe.isFavorite = false;
  await isar.recipes.put(recipe); // Aktualisierungsoperationen

  await isar.recipes.delete(123); // oder Löschoperationen durchführen
});

➡️ Lerne mehr: Transaktionen

Objekt erstellen

Erstelle ein Objekt in einer Collection um es in Isar zu speichern. Die put()-Methode von Isar erstellt das Objekt entweder oder aktualisiert es, je nachdem, ob es bereits in der Collection existiert.

Wenn das ID-Feld null oder Isar.autoIncrement ist, verwendet Isar eine automatisch generierte ID.

final pancakes = Recipe()
  ..id = isar.recipes.autoIncrement()
  ..name = 'Pancakes'
  ..lastCooked = DateTime.now()
  ..isFavorite = true;

await isar.writeAsync((isar) async {
  await isar.recipes.put(pancakes);
})

Ist das ID-Feld nicht-final, weist Isar die generierte ID automatisch dem Objekt zu.

Das Erstellen von mehreren Objekten auf einmal ist genauso einfach:

await isar.writeAsync((isar) async {
  await isar.recipes.putAll([pancakes, pizza]);
})

Objekt aktualisieren

Sowohl das Erstellen als auch das Aktualisieren funktioniert mit collection.put(object). Wenn die ID null ist (oder nicht existiert), wird das Objekt erstellt, andernfalls wird es aktualisiert.

Wenn wir also Pfannkuchen nicht mehr mögen, können wir Folgendes tun:

await isar.writeAsync((isar) async {
  pancakes.isFavorite = false;
  await isar.recipes.put(recipe);
});

Objekt löschen

Willst du ein Objekt in Isar loswerden? Verwende collection.delete(id). Die delete-Methode gibt zurück, ob ein Objekt mit der angegebenen ID gefunden und gelöscht wurde. Lass uns z.B. das Objekt mit der ID 123 löschen:

await isar.writeAsync((isar) async {
  final success = await isar.recipes.delete(123);
  print('Recipe deleted: $success');
});

Ähnlich wie bei get() und put() gibt es auch einen Massenlöschvorgang, der die Anzahl der gelöschten Objekte zurückgibt:

await isar.writeAsync((isar) async {
  final count = await isar.recipes.deleteAll([1, 2, 3]);
  print('We deleted $count recipes');
});

Wenn du die IDs der zu löschenden Objekte nicht kennst ist es auch möglich eine Abfrage zu verwenden:

await isar.writeAsync((isar) async {
  final count = await isar.recipes.filter()
    .isFavoriteEqualTo(false)
    .deleteAll();
  print('We deleted $count recipes');
});