Поскольку Flutter день за днем захватывает рынок, многие базы данных, разработанные специально для Flutter, имеют довольно жесткую конкуренцию своим конкурентам. Одна из них будет обсуждаться в этой статье — База данных Isar. Тогда давайте углубимся…
Об Изаре
Isar — это супербыстрая и мощная база данных для Flutter.
Почему Изар?
Согласно документации, эта база данных утверждает, что имеет следующие функции.
Это очень масштабируемо (много впереди)
Операции с несколькими запросами и изоляты (это асинхронно)
Многозаходные индексы для запросов и поддержка JSON
Открытый источник
Помимо всего этого, использование Isar даст нам в целом:
Специально создан для Flutter (без стандартного кода и довольно прост в использовании)
Отличная документация доступна на https://isar.dev/
Поддерживает несколько платформ Flutter
Давайте перейдем к разделу "Что в нашей таблице содержания".
Содержание
Структура проекта
Изар реализация
- Структура проекта
У нас будет структура модели для книг, которая будет содержать:
Идентификатор книги
Название книг
Автор
и будет выполнять операции CRUD, чтобы сделать его простым и легким в использовании.
Есть несколько других функций, предоставляемых Isar, которые сделают эту статью довольно сложной, и многим из моих читателей может быть очень удобно прочитать … минутную статью (Психология человека).
Что находится в файловой структуре?
lib { main.dart isar_db (directory) { books.dart books.g.dart books_ui } }
Перейдем к разделу реализации.
- Реализация Изара
Добавление зависимостей
Добавьте следующее в файл pubspec.yaml вашего проекта.
Под зависимостями
isar: ^3.0.0-dev.8 isar_generator: ^3.0.0-dev.8
В разделе dev_dependencies
isar_flutter_libs: ^3.0.0-dev.8 build_runner: any
Примечание: я также упомянул обычную версию, потому что с ней я отлично работаю. Я даже пытался использовать последнюю версию, но столкнулся с некоторыми неизбежными проблемами, о которых я расскажу в конце этой статьи.
Далее нам нужно определить класс модели для Книги. В Isar мы аннотируем класс с коллекциями как @Collections.
Вот фрагмент нашего класса модели
import 'package:isar/isar.dart'; part 'books.g.dart'; @Collection() class Books{ final id = Isar.autoIncrement; String? title; String? author; }
Игнорировать «books.g.dart». Он будет создан позже.
Если вы отметите эту строку «final id = Isar.autoIncrement».
Я могу либо выбрать поле book_id, либо использовать инкремент. Оба работают одинаково.
@Id()
int? id;
Затем нам нужно сгенерировать код для создания схемы для книг с помощью этой команды.
flutter pub run build_runner build
Если вы видите, что "books.g.dart" будет создан внутри указанного каталога.
Вот и сделаны начальные шаги.
Следующий шаг — открыть базу данных Isar внутри нашей функции main().
Нам нужен еще один пакет, который дает нам applicationDocumentDirectory(), то есть Path Provider.
Кроме того, для открытия базы данных потребуется:
Схема [создана из build_runner]
путь
инспектор
Вот фрагмент
void main() async { WidgetsFlutterBinding.ensureInitialized(); final dir = await getApplicationSupportDirectory(); final isar = Isar.open( [BooksSchema], directory: dir.path, inspector: true); runApp( MyApp(isar: isar)); }
Кстати, Isar имеет собственный встроенный инспектор, разработанный для
Просмотр записей
Выполнение некоторых запросов и многое другое при изучении
CRUD-операции
1- Читать
Чтобы получить записи из базы данных, мы просто используем эту команду
/// For all await isar.books.where().findAll(); // For specific await isar.books.filter() .titleEqualTo("Mark Mansion") .findAll();
2- Создать
Создать новую запись довольно просто.
final newBook = Books() ..title = "Atomic Habits" ..author = "Mark Manson"; await isar.writeTxn(() async { await isar.books.put(newBook); });
3- Изменить/обновить
final bookUpdate = await isar.books.get(1); bookUpdate!.title = "7 habits of highly effective people"; await isar.writeTxn(() async { await isar.books.put(bookUpdate); });
Просто укажите «id», и все готово.
Однако если идентификатор отсутствует, это не приведет к сбою, а создаст новую запись.
4- Удалить
await isar.writeTxn(() async { await isar.books.delete(4); });
Так просто, как, что.
Давайте создадим наш пользовательский интерфейс
Три потрясающих
Новая запись
Обновлять
Удалить
Вот фрагмент
FloatingActionButton( child: const Text("New",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; final newBook = Books() ..title = "Atomic Habits" ..author = "Mark Manson"; await i.writeTxn(() async { await i.books.put(newBook); }); print("added"); }, ), const SizedBox(width: 10), FloatingActionButton( child: const Text("Update",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; final bookUpdate = await i.books.get(1); bookUpdate!.title = "7 habits of highly effective people"; await i.writeTxn(() async { await i.books.put(bookUpdate); }); print("updated"); }, ), const SizedBox(width: 10), FloatingActionButton( child: const Text("Delete",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; await i.writeTxn(() async { await i.books.delete(4); }); print("deleted"); }, ),
Во-вторых, давайте создадим асинхронные функции, которые бы возвращали все ответы от Isar.
Future<List<Books>> displayBooks() async { var i = await widget.isar; return await i.books.where().findAll(); }
Вот фрагмент для FutureBuilder
FutureBuilder<List<Books>>( future: displayBooks(), builder: (_, s) { if (s.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); } else { return ListView.builder( itemCount: s.data!.length, itemBuilder: (_, i) { return buildBooks(context, s.data![i]); }, ); } }, ), Widget buildBooks(BuildContext context, Books b) { return Card( child: ListTile( leading: CircleAvatar( child: Text("${b.title![0]} ${b.title![0].substring(0)}"), ), title: Text(b.title!), subtitle: Text(b.author!), ), ); }
Вот наглядное представление
Полный и полный фрагмент
import 'package:flutter/material.dart'; import 'package:flutter_dynamic_fields/isar_db/books.dart'; import 'package:isar/isar.dart'; class IsarDbUi extends StatefulWidget { const IsarDbUi({Key? key, required this.isar}) : super(key: key); final Future<Isar> isar; @override State<IsarDbUi> createState() => _IsarDbUiState(); } class _IsarDbUiState extends State<IsarDbUi> { Future<List<Books>> displayBooks() async { var i = await widget.isar; return await i.books.where().findAll(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: FutureBuilder<List<Books>>( future: displayBooks(), builder: (_, s) { if (s.connectionState == ConnectionState.waiting) { return const Center( child: CircularProgressIndicator(), ); } else { return ListView.builder( itemCount: s.data!.length, itemBuilder: (_, i) { return buildBooks(context, s.data![i]); }, ); } }, ), floatingActionButton: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ FloatingActionButton( child: const Text("New",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; final newBook = Books() ..title = "Atomic Habits" ..author = "Mark Manson"; await i.writeTxn(() async { await i.books.put(newBook); }); print("added"); }, ), const SizedBox(width: 10), FloatingActionButton( child: const Text("Update",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; final bookUpdate = await i.books.get(1); bookUpdate!.title = "7 habits of highly effective people"; await i.writeTxn(() async { await i.books.put(bookUpdate); }); print("updated"); }, ), const SizedBox(width: 10), FloatingActionButton( child: const Text("Delete",textAlign: TextAlign.center), onPressed: () async { var i = await widget.isar; await i.writeTxn(() async { await i.books.delete(4); }); print("deleted"); }, ), ], ), ); } Widget buildBooks(BuildContext context, Books b) { return Card( child: ListTile( leading: CircleAvatar( child: Text("${b.title![0]} ${b.title![0].substring(0)}"), ), title: Text(b.title!), subtitle: Text(b.author!), ), ); } }
Однако, если вы не получили записи, вы можете воспользоваться инспектором Изара, который будет выглядеть так:
Вот и все!!!
Понравилась эта статья, 👏 и подписывайтесь на меня!!
Если я что-то пропустил, дайте мне знать в разделе ответов Medium.
Кроме того, дайте мне знать, если у вас есть какие-либо предложения для моей следующей статьи.
P.S. У меня есть собственный канал на YouTube, на который я загружаю контент, связанный с Flutter Series, GitHub и т. д. Если вы найдете материалы своего типа, ставьте лайк, делитесь и подписывайтесь, так как это мотивирует меня создавать для вас больше! Спасибо.
Мое портфолио Приложения, которые могут вам помочь!
Я хотел бы услышать от моей аудитории.