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

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

如何使用 ObjectDB

final path = Directory.current.path + '/my.db';

// 创建数据库实例并打开
final db = ObjectDB(FileSystemStorage(path));

// 插入文档到数据库
db.insert({'name': {'first': 'Some', 'last': 'Body'}, 'age': 18, 'active': true});
db.insert({'name': {'first': 'Someone', 'last': 'Else'}, 'age': 25, 'active': false});

// 更新文档
db.update({Op.gte: {'age': 80}}, {'active': false});

// 删除文档
db.remove({'active': false});

// 在数据库中搜索文档
var result = await db.find({'active': true, 'name.first': 'Some'});

// 清理数据库文件
db.cleanup();

// 关闭数据库
await db.close();

存储类型

// 非持久化(通用)
import 'package:objectdb/src/objectdb_storage_in_memory.dart';
InMemoryStorage();

// 持久化在文件系统(Flutter Mobile & Desktop)
import 'package:objectdb/src/objectdb_storage_filesystem.dart';
FileSystemStorage();

// 持久化在IndexedDB(Flutter Web)
import 'package:objectdb/src/objectdb_storage_indexeddb.dart';
IndexedDBStorage(dbName);

Flutter

检查 example 项目。

方法

  • Future<void> db.cleanup() 清理数据库文件
  • Future<void> db.close() 关闭数据库(应等待以确保所有查询已执行)

查找

  • Future<List<Map>> db.find(Map query) 匹配文档列表
  • Future<Map> db.first(Map query) 第一个匹配的文档
  • Future<Map> db.last(Map query) 最后一个匹配的文档

插入

  • Future<ObjectId> db.insert(Map document) 插入单个文档
  • Future<List<ObjectId>> db.insertMany(List<Map> documents) 插入多个文档

更新

  • Future<int> db.update(Map query, Map changes, [bool replace = false]) 根据 query 更新文档,可选替换整个文档

删除

  • Future<int> db.remove(Map query) 删除匹配 query 的的文档

查询

// 匹配子属字段
{Op.gte: {
    'birthday.year': 18
}}

// 或运算符
{Op.or: {
    'active': true,
    Op.inList: {'group': ['admin', 'moderator']}
}}

// 不等于
{Op.not: {'active': false}}

运算符

  • 逻辑运算符

    • and (默认第一级运算符)
    • or
    • not
  • 比较运算符

    • lt, lte: 小于,小于等于
    • gt, gte: 大于,大于等于
    • inList, notInList: 在列表中,不在列表中
  • 修改运算符

    • set: 设置值
    • max, min: 设置最大或最小整数值
    • increment, multiply: 增加/乘以
    • unset: 取消键/值
    • rename: 重命名键
{Op.set: {'path.to.key': 'value'}} // 设置 entry['path']['to']['key'] = 'value' (路径将创建如果不存在)
{Op.max: {'path.to.key': 2}} // 如果值大于 200,则设置为 200
{Op.min: {'path.to.key': 2}} // 如果值小于 200 则设置为 200
{Op.increment: {'path.to.key': -5}} // 增加 5
{Op.multiply: {'path.to.key': 2}} // 乘以 2
{Op.unset: {'path.to.key': true}} // 如果存在则取消键/值 entry['path']['to']['key']
{Op.rename: {'path.to.key': 'new_key'}} // 新值将位于 entry['path']['to']['new_key']

db.update({
  'age': RegExp('[18-20]'),
  Op.gt: {'duration': 500},
}, {
  Op.max: {'stats.score': 100},
  Op.increment: {'stats.level': -5},
});

示例

// 查询
var result = db.find({
    'active': true,
    Op.or: {
        Op.inList: {'state': ['Florida', 'Virginia', 'New Jersey']},
        Op.gte: {'age': 30},
    }
});

// 同样可以写成
var match = (result['active'] == true && (['Florida', 'Virginia', 'New Jersey'].contains(result['state']) || result['age'] >= 30));

更多关于Flutter本地数据库管理插件objectdb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地数据库管理插件objectdb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用ObjectDB进行本地数据库管理的代码案例。ObjectDB 是一个轻量级的NoSQL数据库,它允许你以对象的形式存储和检索数据,非常适合Flutter应用中的本地数据管理。

首先,你需要在你的Flutter项目中添加ObjectDB的依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  objectdb: ^最新版本号 # 请替换为当前最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤使用ObjectDB:

  1. 初始化数据库

    首先,你需要初始化数据库。这通常在你的应用的主入口文件中进行,比如main.dart

    import 'package:flutter/material.dart';
    import 'package:objectdb/objectdb.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // 初始化数据库
        ObjectDB.init('my_database.odb');
    
        return MaterialApp(
          title: 'Flutter ObjectDB Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
  2. 定义数据模型

    接下来,你需要定义一个数据模型,这个模型将用于存储你的数据。ObjectDB使用注解来标记类的字段。

    import 'package:objectdb/objectdb.dart';
    
    [@Entity](/user/Entity)()
    class User {
      @PrimaryKey()
      int id;
    
      @Column()
      String name;
    
      @Column()
      int age;
    
      User({required this.id, required this.name, required this.age});
    }
    
  3. CRUD操作

    现在,你可以在你的应用中执行CRUD(创建、读取、更新、删除)操作。

    import 'package:flutter/material.dart';
    import 'package:objectdb/objectdb.dart';
    import 'user_model.dart'; // 假设你的数据模型文件名为user_model.dart
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<User> users = [];
    
      @override
      void initState() {
        super.initState();
    
        // 示例:添加用户
        User user1 = User(id: 1, name: 'Alice', age: 30);
        User user2 = User(id: 2, name: 'Bob', age: 25);
    
        ObjectDB.box<User>().put(user1);
        ObjectDB.box<User>().put(user2);
    
        // 示例:读取所有用户
        loadUsers();
      }
    
      void loadUsers() async {
        List<User> loadedUsers = await ObjectDB.box<User>().getAll();
        setState(() {
          users = loadedUsers;
        });
      }
    
      void updateUser(User user) async {
        await ObjectDB.box<User>().put(user);
        loadUsers();
      }
    
      void deleteUser(int id) async {
        await ObjectDB.box<User>().delete(id);
        loadUsers();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('ObjectDB Demo'),
          ),
          body: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: [
                // 显示用户列表
                Expanded(
                  child: ListView.builder(
                    itemCount: users.length,
                    itemBuilder: (context, index) {
                      User user = users[index];
                      return ListTile(
                        title: Text('${user.name} (${user.age})'),
                        subtitle: Text('ID: ${user.id}'),
                        trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () {
                            deleteUser(user.id);
                          },
                        ),
                        onTap: () {
                          // 示例:更新用户
                          User updatedUser = User(
                            id: user.id,
                            name: user.name + ' (updated)',
                            age: user.age + 1,
                          );
                          updateUser(updatedUser);
                        },
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    

这个代码案例展示了如何在Flutter应用中使用ObjectDB进行本地数据库管理,包括初始化数据库、定义数据模型以及执行基本的CRUD操作。你可以根据实际需求进一步扩展和修改这个示例。

回到顶部