在应用程序的设计中,有时需要永久保存特定数据。
这时就需要在用户的手机中设计一个本地数据库。
本地数据库有很多不同的包,
这次介绍一个快速的本地数据库包Isar Database。
什麼是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