Поскольку 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 и т. д. Если вы найдете материалы своего типа, ставьте лайк, делитесь и подписывайтесь, так как это мотивирует меня создавать для вас больше! Спасибо.



Мое портфолио Приложения, которые могут вам помочь!

Я хотел бы услышать от моей аудитории.