Flutter本地数据库管理插件ObjectBox的使用

Flutter本地数据库管理插件ObjectBox的使用

简介

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或填写反馈表单与我们联系。感谢您的支持!


希望这篇文档对你有所帮助!如果你有更多问题,欢迎继续提问。

1 回复

更多关于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进行本地数据库管理。你可以根据需要扩展这个示例,添加更多的实体和复杂的查询操作。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!