[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-local-database-in-flutter-con-isar-nosql-veloce-e-reattivo":3,"comments-article-local-database-in-flutter-con-isar-nosql-veloce-e-reattivo":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},41,"Local database in Flutter con Isar: NoSQL veloce e reattivo","local-database-in-flutter-con-isar-nosql-veloce-e-reattivo","Isar è un database NoSQL scritto per Flutter: velocissimo, tipizzato e reattivo. Scopri come integrarlo per gestire la persistenza locale con query fluide, indici e watch in tempo reale.","## Cos'è Isar\n\nQuando si parla di persistenza locale in Flutter, spesso si pensa subito a SQLite o a soluzioni relazionali. Ma esiste un'alternativa NoSQL nata specificamente per Flutter e Dart: **Isar**. È un database embedded estremamente veloce, con supporto a query tipizzate, indici composti, transazioni e — cosa fondamentale — la reattività tramite `watch`.\n\nA differenza di soluzioni come Hive, Isar è pensato anche per dataset di grandi dimensioni, offre query complesse e un ottimo supporto agli indici, mantenendo comunque un'API pulita e generata automaticamente.\n\n## Perché sceglierlo\n\n- **Performance**: scritto in Rust, con benchmark che lo pongono tra i più rapidi.\n- **Type-safe**: le query sono generate in base ai modelli, con autocompletamento.\n- **Reattivo**: puoi ascoltare i cambiamenti su collezioni e singoli oggetti.\n- **Cross-platform**: iOS, Android, desktop e web.\n- **Zero configurazione SQL**: nessuna gestione manuale di schemi o migrazioni complesse.\n\n## Installazione\n\nAggiungi le dipendenze al `pubspec.yaml`:\n\n```yaml\ndependencies:\n  isar: ^3.1.0\n  isar_flutter_libs: ^3.1.0\n  path_provider: ^2.1.0\n\ndev_dependencies:\n  isar_generator: ^3.1.0\n  build_runner: ^2.4.0\n```\n\n## Definire un modello\n\nLe collezioni si dichiarano con l'annotazione `@collection`. Ogni oggetto ha bisogno di un campo `id` di tipo `Id`.\n\n```dart\nimport 'package:isar\u002Fisar.dart';\n\npart 'ricetta.g.dart';\n\n@collection\nclass Ricetta {\n  Id id = Isar.autoIncrement;\n\n  @Index(caseSensitive: false)\n  late String titolo;\n\n  late int minutiPreparazione;\n\n  @Index()\n  late List\u003CString> tag;\n\n  bool preferita = false;\n}\n```\n\nDopo aver definito i modelli, genera il codice:\n\n```bash\ndart run build_runner build\n```\n\nQuesto crea il file `ricetta.g.dart` con schema e query tipizzate.\n\n## Aprire il database\n\n```dart\nimport 'package:isar\u002Fisar.dart';\nimport 'package:path_provider\u002Fpath_provider.dart';\n\nFuture\u003CIsar> apriDatabase() async {\n  final dir = await getApplicationDocumentsDirectory();\n  return Isar.open(\n    [RicettaSchema],\n    directory: dir.path,\n  );\n}\n```\n\nConviene mantenere una singola istanza di `Isar` per tutta la durata dell'app, ad esempio tramite un service o l'iniezione delle dipendenze.\n\n## Scrivere dati\n\nTutte le operazioni di scrittura avvengono all'interno di una transazione:\n\n```dart\nfinal ricetta = Ricetta()\n  ..titolo = 'Pasta al pomodoro'\n  ..minutiPreparazione = 20\n  ..tag = ['primo', 'veloce'];\n\nawait isar.writeTxn(() async {\n  await isar.ricettas.put(ricetta); \u002F\u002F insert o update\n});\n```\n\nIl metodo `put` gestisce sia l'inserimento sia l'aggiornamento in base all'`id`.\n\n## Leggere e interrogare\n\nLe query sono fluide e tipizzate:\n\n```dart\n\u002F\u002F Tutte le ricette\nfinal tutte = await isar.ricettas.where().findAll();\n\n\u002F\u002F Filtri con condizioni\nfinal veloci = await isar.ricettas\n    .filter()\n    .minutiPreparazioneLessThan(30)\n    .and()\n    .preferitaEqualTo(true)\n    .findAll();\n\n\u002F\u002F Ricerca per tag e ordinamento\nfinal primi = await isar.ricettas\n    .filter()\n    .tagElementEqualTo('primo')\n    .sortByTitolo()\n    .findAll();\n```\n\n## Reattività con watch\n\nUno dei punti di forza di Isar è la possibilità di reagire ai cambiamenti. Perfetto da combinare con `StreamBuilder` o con soluzioni di state management.\n\n```dart\nStream\u003CList\u003CRicetta>> osservaPreferite() {\n  return isar.ricettas\n      .filter()\n      .preferitaEqualTo(true)\n      .watch(fireImmediately: true);\n}\n```\n\nNell'interfaccia:\n\n```dart\nStreamBuilder\u003CList\u003CRicetta>>(\n  stream: repository.osservaPreferite(),\n  builder: (context, snapshot) {\n    final ricette = snapshot.data ?? [];\n    return ListView.builder(\n      itemCount: ricette.length,\n      itemBuilder: (_, i) => ListTile(\n        title: Text(ricette[i].titolo),\n      ),\n    );\n  },\n)\n```\n\nCon `fireImmediately: true` lo stream emette subito lo stato attuale, poi ogni volta che i dati cambiano.\n\n## Eliminare dati\n\n```dart\nawait isar.writeTxn(() async {\n  await isar.ricettas.delete(id);\n  \u002F\u002F oppure con query\n  await isar.ricettas.filter().preferitaEqualTo(false).deleteAll();\n});\n```\n\n## Buone pratiche\n\n- **Isola l'accesso ai dati** in un repository, evitando di chiamare Isar direttamente dai widget.\n- **Usa gli indici** sui campi su cui filtri o ordini spesso: migliorano drasticamente le performance.\n- **Riutilizza l'istanza** di Isar invece di aprirla più volte.\n- **Sfrutta i link** (`IsarLink` e `IsarLinks`) per modellare relazioni tra collezioni senza chiavi esterne manuali.\n- Per progetti nuovi valuta anche lo stato del maintenance: verifica sempre la versione più recente sul repository ufficiale.\n\n## Conclusione\n\nIsar è una scelta eccellente quando serve una persistenza locale veloce, reattiva e priva della complessità di SQL. La combinazione tra query tipizzate, indici e stream lo rende particolarmente adatto ad app che devono aggiornare l'interfaccia in tempo reale al variare dei dati. Integrandolo dietro un repository ottieni un layer dati pulito, testabile e facilmente sostituibile.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F9131fa5b-4e9f-4a16-9667-76dfc163b044.jpg",null,"published","2026-07-15T04:00:40+00:00","Isar in Flutter: database NoSQL veloce e reattivo","Guida pratica a Isar in Flutter: modelli, query tipizzate, indici e reattività con watch per la persistenza locale NoSQL veloce e reattiva.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1785219601502]