Flutter数据库管理插件realm_repo的使用

Flutter数据库管理插件realm_repo的使用

realm_repo 是一个用于简化 Flutter 中 Realm 数据库操作的插件。通过声明数据库、在线或离线仓库,可以轻松地进行单个对象和集合的 CRUD 操作。

主要特性

  • 在线和离线支持:可以处理在线和离线数据库操作。
  • 灵活的仓库设计:通过 OnlineValue, OfflineValue, OnlineCollection, 和 OfflineCollection 实现对单个对象和集合的管理。
  • 简单易用:通过继承 RealmOnlineDatabaseRealmOfflineDatabase 类来实现数据库的管理。

实体(Entities)

要创建一个 Realm 模型,需要将类标注为 @RealmModel 并且类名以 _ 开头,并添加一个主键标注 @PrimaryKey

import 'package:realm/realm.dart';

part 'realm_model_example.g.dart';

@RealmModel()
class _MyRealmObject {
  @PrimaryKey()
  @MapTo('_id')
  late ObjectId id;
  late String name;
}

自动生成构建类

为了生成构建类,需要运行以下命令并确保导入了 part '$name.g.dart'

flutter pub run realm generate

Realm 仓库(Realm Repositories)

RealmRepositories 是一种封装在仓库中的集合类型。只需添加以下导入:

import 'package:realm_repo/realm_repo.dart';
1. 在线值(OnlineValue)

用于存储单个对象到云端 Atlas。

late final OnlineValueRealmRepository<MyRealmObject> myUserDataRepository = 
OnlineValueRealmRepository(appId: appId, user: user, schemas: [MyRealmObject.schema]);
2. 离线值(OfflineValue)

用于存储单个对象到离线数据库。

final OfflineValueRealmRepository<MyRealmObject> myUserDataRepository =
OfflineValueRealmRepository(schemas: [MyRealmObject.schema]);
3. 在线集合(OnlineCollection)

用于存储对象集合到云端 Atlas。

late final OnlineCollectionRealmRepository<MyRealmObject> allUserDataRepository = 
OnlineCollectionRealmRepository(appId: appId, user: user, schemas: [MyRealmObject.schema]);
4. 离线集合(OfflineCollection)

用于存储对象集合到离线数据库。

final OfflineCollectionRealmRepository<MyRealmObject> allUserDataRepository =
OfflineCollectionRealmRepository(schemas: [MyRealmObject.schema]);

Realm 数据库(Realm Databases)

要实现 Realm 数据库,可以通过扩展 RealmOnlineDatabaseRealmOfflineDatabase 类来声明相应的仓库。

在线数据库(Online Database)
class MyOnlineDatabase extends RealmOnlineDatabase {
  MyOnlineDatabase({required super.appId});

  late final OnlineValueRealmRepository<MyRealmObject> myUserDataRepository = 
      OnlineValueRealmRepository(
          appId: appId, user: user, schemas: [MyRealmObject.schema]);
  late final OnlineCollectionRealmRepository<MyRealmObject> allUserDataRepository = 
      OnlineCollectionRealmRepository(
          appId: appId, user: user, schemas: [MyRealmObject.schema]);
}

Future<void> main() async {
  /// 使用在线数据库来存储集合和单个对象
  MyOnlineDatabase onlineDb = MyOnlineDatabase(appId: 'Insert APP ID HERE');

  /// 初始化数据库
  await onlineDb.init();
}
离线数据库(Offline Database)
class MyOfflineDatabase extends RealmOfflineDatabase {
  MyOfflineDatabase();

  final OfflineValueRealmRepository<MyRealmObject> myUserDataRepository =
      OfflineValueRealmRepository(schemas: [MyRealmObject.schema]);
  final OfflineCollectionRealmRepository<MyRealmObject> allUserDataRepository =
      OfflineCollectionRealmRepository(schemas: [MyRealmObject.schema]);
}

Future<void> main() async {
  /// 使用离线数据库来存储集合和单个对象
  MyOfflineDatabase offlineDb = MyOfflineDatabase();
}

示例代码

import 'package:realm/realm.dart';
import 'package:realm_repo/realm_repo.dart';

import 'realm_model_example.dart';

Future<void> main() async {
  ObjectId id = ObjectId();
  String name = "Realm Object";
  MyRealmObject realmObj = MyRealmObject(id, name);

  // 在线数据库
  /// 使用在线数据库来存储集合和单个对象
  MyOnlineDatabase onlineDb = MyOnlineDatabase(appId: 'Insert APP ID HERE');

  /// 初始化数据库
  await onlineDb.init();

  // 创建
  /// 保存单个对象作为唯一值
  onlineDb.myUserDataRepository.save(realmObj);

  /// 保存对象到集合
  onlineDb.allUserDataRepository.save(realmObj);

  /// 保存多个对象到集合
  onlineDb.allUserDataRepository.saveAll([realmObj, realmObj, realmObj]);

  // 读取
  /// 获取存储的单个对象的值
  onlineDb.myUserDataRepository.get();

  /// 在集合中按索引查找
  onlineDb.allUserDataRepository.get(0);

  /// 查找集合中的所有对象
  onlineDb.allUserDataRepository.getAll();

  // 离线数据库
  /// 使用离线数据库来存储集合和单个对象
  MyOfflineDatabase offlineDb = MyOfflineDatabase();

  // 更新
  realmObj.name = "Realm Object 2";

  /// 更新单个对象的值
  offlineDb.myUserDataRepository.save(realmObj);

  /// 更新集合中具有相同ID的对象
  offlineDb.allUserDataRepository.save(realmObj);

  /// 更新集合中具有相同ID的多个对象
  offlineDb.allUserDataRepository.saveAll([realmObj]);

  // 删除
  /// 删除单个对象的值
  offlineDb.myUserDataRepository.delete();

  /// 删除集合中的对象
  offlineDb.allUserDataRepository.delete(realmObj);

  /// 删除集合中的所有值
  offlineDb.allUserDataRepository.deleteAll();
}

/// 如何实现在线数据库
/// 只需继承 RealmOnlineDB 类并提供 appId
/// 简单地添加到现有数据库中
/// 然后声明您的仓库
class MyOnlineDatabase extends RealmOnlineDatabase {
  MyOnlineDatabase({required super.appId});

  late final OnlineValueRealmRepository<MyRealmObject> myUserDataRepository = 
      OnlineValueRealmRepository(
          appId: appId, user: user, schemas: [MyRealmObject.schema]);
  late final OnlineCollectionRealmRepository<MyRealmObject> allUserDataRepository = 
      OnlineCollectionRealmRepository(
          appId: appId, user: user, schemas: [MyRealmObject.schema]);
}

/// 同样如 MyOnlineDatabase 所述,但没有 appId
class MyOfflineDatabase extends RealmOfflineDatabase {
  MyOfflineDatabase();

  final OfflineValueRealmRepository<MyRealmObject> myUserDataRepository =
      OfflineValueRealmRepository(schemas: [MyRealmObject.schema]);
  final OfflineCollectionRealmRepository<MyRealmObject> allUserDataRepository =
      OfflineCollectionRealmRepository(schemas: [MyRealmObject.schema]);
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用realm_repo进行数据库管理的代码示例。realm_repo并不是一个广泛认可的官方插件,但假设它是一个类似于Realm数据库管理的Flutter插件,我们可以根据Realm数据库的一般用法来提供一个示例。如果你指的是一个具体的第三方库,请根据实际情况调整代码。

首先,确保你的Flutter项目已经添加了Realm依赖。在pubspec.yaml文件中添加依赖项(假设存在一个名为realm_repo的插件):

dependencies:
  flutter:
    sdk: flutter
  realm_repo: ^latest_version  # 替换为实际的最新版本号

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

接下来,我们创建一个简单的Flutter应用,展示如何使用Realm进行数据库管理。

1. 初始化Realm

在你的主文件(如main.dart)中,初始化Realm并设置基本的配置。

import 'package:flutter/material.dart';
import 'package:realm_repo/realm_repo.dart'; // 假设这是Realm的Flutter插件

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化Realm
  Realm.init(path: 'path/to/your/realm/file');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Realm Demo'),
        ),
        body: RealmDemoPage(),
      ),
    );
  }
}

2. 定义Realm模型

定义一个Realm模型类,这个类需要继承自RealmObject(注意:这是Realm SDK中的常见做法,但具体实现可能因插件而异)。

import 'package:realm_repo/realm_repo.dart';

class User extends RealmObject {
  String? name;
  int? age;

  // Realm要求有一个无参构造函数
  User() {}

  // 为了方便,可以添加一个命名构造函数
  User.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    age = json['age'];
  }

  // 重写toJson方法,方便序列化
  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
    };
  }
}

3. 使用Realm进行CRUD操作

在你的页面组件中,执行创建、读取、更新和删除(CRUD)操作。

import 'package:flutter/material.dart';
import 'package:realm_repo/realm_repo.dart';
import 'user_model.dart'; // 假设User类定义在这个文件中

class RealmDemoPage extends StatefulWidget {
  @override
  _RealmDemoPageState createState() => _RealmDemoPageState();
}

class _RealmDemoPageState extends State<RealmDemoPage> {
  late Realm realm;

  @override
  void initState() {
    super.initState();
    // 打开Realm实例
    realm = Realm();
  }

  @override
  void dispose() {
    // 关闭Realm实例
    realm.close();
    super.dispose();
  }

  void addUser() async {
    final user = User.fromJson({'name': 'John Doe', 'age': 30});
    await realm.write(() {
      realm.add(user);
    });
  }

  void readUsers() async {
    final users = await realm.objects<User>().toList();
    print(users.map((e) => e.toJson()).toList());
  }

  void updateUser(User user) async {
    await realm.write(() {
      final existingUser = realm.object(ofType: User.className, forKey: user.id); // 假设User有id属性
      if (existingUser != null) {
        existingUser!.name = user.name;
        existingUser.age = user.age;
      }
    });
  }

  void deleteUser(User user) async {
    await realm.write(() {
      final existingUser = realm.object(ofType: User.className, forKey: user.id); // 假设User有id属性
      if (existingUser != null) {
        realm.delete(existingUser);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: addUser,
            child: Text('Add User'),
          ),
          ElevatedButton(
            onPressed: readUsers,
            child: Text('Read Users'),
          ),
          // 你可以添加更多的按钮来执行更新和删除操作,并传递相应的User对象
        ],
      ),
    );
  }
}

注意事项

  1. Realm模型:确保你的模型类符合Realm的要求,比如有无参构造函数、所有属性都是可空的或具有默认值等。
  2. 异步操作:Realm的写操作是异步的,使用await.then()来处理异步结果。
  3. 错误处理:在实际应用中,添加错误处理逻辑来捕获和处理可能发生的异常。

由于realm_repo可能是一个假设的插件名,具体的API和实现细节可能会有所不同。请参考实际使用的Realm Flutter插件的文档来获取准确的用法和API参考。

回到顶部