【本地数据库】方便且快速!Isar Database的概要及使用方法介绍!!

在应用程序的设计中,有时需要永久保存特定数据。
这时就需要在用户的手机中设计一个本地数据库。

本地数据库有很多不同的包,
这次介绍一个快速的本地数据库包Isar Database

关于 Isar,目前(截至2025年1月16日)该包的更新已停止。
因此,由于依赖关系的影响,无法升级其他包的版本。
使用时需要注意。

作为替代的本地数据库,我们在以下文章中介绍了 Drift。
【本地关系型数据库】高速!介绍 Drift 的概述及使用方法!!

什麼是Isar Database?

Isar Database是一個面向Flutter的高速跨平台數據庫。
當應用程序需要永久保存數據時,它是一個非常適合的本地數據庫。

除了Isar Database之外,還有很多其他本地數據庫包,但Isar Database因以下幾個理由而受歡迎:

  • 高速和高效
  • 對初學者友好
  • 由於是NoSQL數據庫,擴展性很高
    (可以根據應用程序的成長進行擴展)

在什麼情況下需要它?

在普通的應用程序中,使用的變量和狀態(State)在應用程序結束時,
數據也會一起消失。

但在設計應用程序時,有時會遇到希望在下次啟動時
繼續處理用戶操作中產生的狀態或變量的場景。

此時,可以將數據轉移到Isar Database中,
管理永久保存的數據。

Isar Database的使用方法

Isar Database是一個文檔型的NoSQL數據庫。
在關係型數據庫(RDB)中,保存的數據稱為“記錄”,
而在文檔型的NoSQL數據庫中,保存的數據稱為“集合”。

下面介紹其使用方法。

準備環境

在“pubspec.yaml”中添加所需的包。

dependencies:

  flutter:
    sdk: flutter
  flutter_localizations: 
    sdk: flutter
  isar: ^3.1.0
  isar_flutter_libs: ^3.1.0

dev_dependencies:
  build_runner: ^2.3.3
  dart_code_metrics: ^5.4.0

  flutter_lints: ^2.0.0
  flutter_test:
    sdk: flutter
  isar_generator: ^3.1.0
  • isar: Isar數據庫的核心庫
  • isar_flutter_libs: 在Flutter中使用Isar的附加庫
  • build_runner: 用於生成Dart代碼的工具
  • isar_generator: Isar的代碼自動生成工具,從模型中自動生成所需代碼

定義集合

定義要管理的數據。
例如,將用於登錄的用戶信息定義在”user.dart”中。

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  // ID使用Isar的功能自動遞增
  Id? id = Isar.autoIncrement;
  String? userName;
  String? eMail;
}

規則1:@collection
在定義的開頭寫上“@collection”。
這是Isar識別為數據庫表的註釋。
是“這裡定義了集合”的標記。

規則2:唯一ID
定義集合時,必須設置唯一標識的ID。
這次在id中使用“Isar.autoIncrement”。
使用Isar.autoIncrement時,Isar會自動分配唯一ID。

導入的”user.g.dart”此時尚不存在。
通過在終端運行以下代碼,將創建“user.g.dart”。

flutter pub run build_runner build --delete-conflicting-outputs

註冊集合

創建要插入數據的對象,通過put插入集合。

final user = User()
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);

users是什麼?

突然出現的isar.users.put中的“users”是什麼?

users方法用於對user集合進行操作。
通過自動生成的”user.g.dart”,會自動定義user集合的users方法。

根據用戶定義的集合名,這裡的集合名也會發生變化。
例如,定義的集合是Item時,則會變為Items。

如果不清楚方法名,可以參考“xxx.g.dart”。

更新集合

更新集合時,使用與註冊時相同的put方法。
創建具有ID的對象,通過put進行更新。
當ID已存在時,會 更新集合;不存在時,則會插入集合。

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);

刪除集合

刪除集合時,指定ID並執行delete。

await isar.users.delete(123);

事務處理

註冊、更新和刪除集合通常在事務處理中執行。

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

// 以下處理全部提交時,數據庫會更新
await isar.writeTxn(() async {
  await isar.users.put(user);
  await isar.users.delete(123);
});

獲取集合

獲取集合的方法有很多。

使用get獲取

// 獲取所有User集合
final user = await isar.users;

// 獲取ID為“123”的User集合
final user = await isar.users.get(123);

Filter句的使用方法

Filter句可以對集合中的元素指定條件進行搜索。

// 獲取email中包含“@example.com”的元素
final users = await isar.users
 .filter()
 .emailcontains('@example.com')
 .findAll();
  //※“findAll()”用於獲取所有符合條件的集合

Where句的使用方法

Where句只能用於設置了索引的元素條件。
相反,Filter句可以對任何元素使用,但Where句處理速度更快。

例如,如果在user.dart中定義了如下集合:

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  Id? id = Isar.autoIncrement;
  String? userName;

  // 對年齡元素設置索引
  @Index()
  String? age;

  String? eMail;
}

則可以設置如下Where句。

// 獲取年齡為30的集合
final user = await isar.users
  .where()
  .ageEqualTo(30)
  .findAll();

// 獲取年齡大於30的集合
final user = await isar.users
  .where()
  .ageGreaterThan(30)
  .findAll();

“ageEqualTo”和“ageGreaterThan”的參數
在自動生成的“user.g.dart”中定義。

其他各種功能

除了本次介紹的內容外,Isar Database還有很多其他用法。
有興趣的朋友可以參考官方網站。
官方網站:https://isar.dev/zh/schema.html

标题和URL已复制