Flutter本地数据库管理插件ObjectBox的使用
Flutter本地数据库管理插件ObjectBox的使用
简介
ObjectBox 是一个高性能的NoSQL数据库,专为Dart和Flutter应用程序设计。它支持多种平台(Android、iOS、macOS、Linux、Windows),并且以其快速的数据处理能力著称。ObjectBox 提供了对AI的支持,包括设备上的向量搜索,使其成为开发智能应用的理想选择。
特点
- 人工智能:超快的设备上向量搜索。
- 超级快速:比SQLite快10倍 - 查看性能基准。
- ACID兼容:原子性、一致性、隔离性、持久性。
- 跨平台:支持多个操作系统。
- 可扩展性:能够轻松处理数百万个对象。
- 关系支持:内置对象链接/关系。
- 查询功能:可以根据需要过滤数据,甚至跨越关系。
- 模式迁移:只需更改模型,其余由我们处理。
- 数据同步:仅在需要的时间和地点进行同步。
示例代码
以下是一个简单的示例,展示了如何使用ObjectBox保存、读取、更新和删除Dart对象。
定义实体类
import 'package:objectbox/objectbox.dart';
@Entity()
class Person {
@Id()
int id;
String firstName;
String lastName;
Person({this.id = 0, required this.firstName, required this.lastName});
}
初始化Store并操作数据
import 'package:objectbox/objectbox.dart';
import 'objectbox.g.dart'; // generated file
void main() async {
// 打开或创建一个新的Store实例
final store = await openStore(directory: 'person-db');
final box = store.box<Person>();
// 创建新对象
var person = Person(firstName: 'Joe', lastName: 'Green');
final id = box.put(person); // 插入
// 查询对象
person = box.get(id)!; // 获取
print('Read: ${person.firstName} ${person.lastName}');
// 更新对象
person.lastName = 'Black';
box.put(person); // 更新
// 删除对象
box.remove(person.id); // 删除
// 查询特定条件的对象
final query = box
.query(Person_.firstName.equals('Joe') & Person_.lastName.startsWith('B'))
.build();
final List<Person> people = query.find();
for (var p in people) {
print('Found: ${p.firstName} ${p.lastName}');
}
query.close();
// 关闭store
await store.close();
}
性能基准
我们测试了四种主要的数据库操作(CRUD)的性能,并与sqflite和Hive进行了比较。以下是ObjectBox与其他数据库的性能对比图:
你可以通过我们的benchmark app自行运行这些测试。
更多资源
如果你有任何问题或建议,请随时通过GitHub Issues、Twitter或填写反馈表单与我们联系。感谢您的支持!
希望这篇文档对你有所帮助!如果你有更多问题,欢迎继续提问。
更多关于Flutter本地数据库管理插件ObjectBox的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用ObjectBox作为本地数据库管理插件的代码示例。这个示例将展示如何设置ObjectBox,定义一个实体,并进行基本的CRUD(创建、读取、更新、删除)操作。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加ObjectBox的依赖:
dependencies:
flutter:
sdk: flutter
objectbox: ^3.0.0 # 请检查最新版本号
2. 配置ObjectBox
在android/app/build.gradle
中添加以下配置以启用ProGuard(如果你使用它):
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
...
}
}
...
}
dependencies {
implementation 'io.objectbox:objectbox-android-objectbrowser:3.0.0' // 可选,用于调试
...
}
在ios/Podfile
中,添加对Swift的支持(如果需要):
platform :ios, '10.0'
target 'Runner' do
use_frameworks!
config = use_native_modules!
# Flutter Pod
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
# Enable Swift support for ObjectBox
$static_framework = true
# Plugins
...
end
3. 初始化ObjectBox
在lib/main.dart
中初始化ObjectBox:
import 'package:flutter/material.dart';
import 'package:objectbox/objectbox_flutter_libs.dart';
import 'package:objectbox/objectbox.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ObjectBox.init("my-database.db"); // 初始化数据库
runApp(MyApp());
}
4. 定义实体
创建一个新的Dart文件,例如lib/models/person.dart
,定义你的实体:
import 'package:objectbox/objectbox.dart';
@Entity()
class Person extends EntityBase {
Int id = 0; // 主键
String? name;
int? age;
Person() {}
Person.fromData({required this.id, required this.name, required this.age});
// 将数据转换为Map,用于存储
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'age': age,
};
}
// 从Map中读取数据
factory Person.fromMap(Map<String, dynamic> map) {
return Person.fromData(
id: map['id'] as int,
name: map['name'] as String?,
age: map['age'] as int?,
);
}
}
5. 进行CRUD操作
在lib/main.dart
中添加CRUD操作的代码:
import 'package:flutter/material.dart';
import 'package:objectbox/objectbox_flutter_libs.dart';
import 'package:objectbox/objectbox.dart';
import 'models/person.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ObjectBox.init("my-database.db");
final store = StoreInfo<Person>();
final box = await Box<Person>().put(store);
// 创建
Person person = Person()..name = "John Doe"..age = 30;
await box.put(person);
// 读取
List<Person> persons = await box.getAll();
print("All persons: $persons");
// 更新
person.age = 31;
await box.put(person);
// 删除
await box.remove(person.id);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('ObjectBox Demo'),
),
body: Center(
child: Text('Check the console for ObjectBox operations!'),
),
),
);
}
}
6. 运行应用
现在,你可以运行你的Flutter应用,并查看控制台输出,以确认ObjectBox的CRUD操作是否成功。
这个示例展示了如何在Flutter项目中使用ObjectBox进行本地数据库管理。你可以根据需要扩展这个示例,添加更多的实体和复杂的查询操作。