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

发布于 1周前 作者 htzhanglong 来自 Flutter

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

警告

在2024年9月,MongoDB宣布了Atlas Device Sync + Realm SDKs的弃用。对于不带同步功能的realm-dart版本,请安装版本20或查看community分支。

特性

  • 移动优先:Realm是第一个直接运行在手机、平板和可穿戴设备上的数据库。
  • 简单:Realm的对象导向数据模型易于学习,不需要ORM,并且API可以让你快速上手。
  • 现代:支持最新的Dart和Flutter版本,并且内置空安全。
  • 快速:在常见操作中比原始SQLite更快,同时保持丰富的特性集。
  • MongoDB Atlas Device Sync:简化用户、设备和后端之间的实时数据同步。

开始使用

1. 导入Realm

首先在你的Dart文件中导入Realm包:

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

part 'app.realm.dart'; // declare a part file.

@RealmModel() // define a data model class named `_Car`.
class _Car {
  late String make;
  late String model;
  int? kilometers = 500;
}

2. 生成RealmObject类

运行以下命令生成Car类:

dart run realm generate

3. 打开一个Realm并添加对象

var config = Configuration.local([Car.schema]);
var realm = Realm(config);

var car = Car("Tesla", "Model Y", kilometers: 5);
realm.write(() {
  realm.add(car);
});

4. 查询Realm中的对象

var cars = realm.all<Car>();
Car myCar = cars[0];
print("My car is ${myCar.make} model ${myCar.model}");

cars = realm.all<Car>().query("make == 'Tesla'");

5. 获取查询结果的变化流

final cars = realm.all<Car>().query(r'make == $0', ['Tesla']);
cars.changes.listen((changes) {
  print('Inserted indexes: ${changes.inserted}');
  print('Deleted indexes: ${changes.deleted}');
  print('Modified indexes: ${changes.modified}');
});
realm.write(() => realm.add(Car('VW', 'Polo', kilometers: 22000)));

完整示例代码

创建数据模型类

import 'package:realm/realm.dart';

part 'catalog.realm.dart';

@RealmModel()
class _Item {
    @PrimaryKey()
    late int id;

    late String name;

    int price = 42;
}

生成RealmObject类

dart run realm generate

使用RealmObject类

// Create a Configuration object
var config = Configuration.local([Item.schema]);

// Open a Realm
var realm = Realm(config);

var myItem = Item(0, 'Pen', price: 4);

// Open a write transaction
realm.write(() {
    realm.add(myItem);
    var item = realm.add(Item(1, 'Pencil')..price = 20);
});

// Read object properties from realm
print(myItem.name);
print(myItem.price);

// Update object properties
realm.write(() {
    myItem.price = 20;
    myItem.name = "Special Pencil";
});

// Get objects from the realm
var items = realm.all<Item>();
var item = items[1];
var itemByKey = realm.find<Item>(0);

// Filter and sort object
var objects = realm.query<Item>("name == 'Special Pencil'");
var name = 'Pen';
objects = realm.query<Item>(r'name == $0', [name]);

// Close the realm
realm.close();

同步数据

设置Atlas App Services

  1. cloud.mongodb.com创建账户。
  2. 创建一个新的App。
  3. 配置适当的认证提供者类型。
  4. 在“Device Sync”菜单中启用Flexible Sync。
  5. 复制应用程序的App ID。

使用Device Sync

String appId = "<Atlas App ID>";
final appConfig = AppConfiguration(appId);
final app = App(appConfig);
final user = await app.logIn(Credentials.anonymous());

final config = Configuration.flexibleSync(user, [Task.schema]);
final realm = Realm(config);

realm.subscriptions.update((mutableSubscriptions) {
  mutableSubscriptions.add(realm.query<Task>(r'status == $0 AND progressMinutes == $1', ["completed", 100]));
});
await realm.subscriptions.waitForSynchronization();

realm.write(() {
  realm.add(Task(ObjectId(), "Send an email", "completed", 4));
  realm.add(Task(ObjectId(), "Create a meeting", "completed", 100));
  realm.add(Task(ObjectId(), "Call the manager", "init", 2));
});
realm.close();

通过以上步骤,你可以开始使用realm_dart插件来管理和同步Flutter应用中的数据。更多详细信息和文档请参考官方文档


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用realm_dart插件进行数据库管理的代码示例。realm_dart是一个高效的移动数据库,专为快速读取、写入和查询数据而设计。以下示例将展示如何设置Realm数据库、创建模型、执行CRUD(创建、读取、更新、删除)操作。

1. 添加依赖

首先,在pubspec.yaml文件中添加realm_dart依赖:

dependencies:
  flutter:
    sdk: flutter
  realm_dart: ^latest_version # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 配置Realm

在项目的入口文件(通常是main.dart)中,初始化Realm。

import 'package:flutter/material.dart';
import 'package:realm_dart/realm_dart.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化Realm配置
  final RealmConfiguration config = RealmConfiguration()
    ..schemaVersion = 0 // 初始版本
    ..path = 'path/to/your/realm/file'; // Realm文件路径

  // 打开Realm实例
  final Realm realm = await Realm.open(config);

  runApp(MyApp(realm: realm));
}

class MyApp extends StatelessWidget {
  final Realm realm;

  MyApp({required this.realm});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(realm: realm),
    );
  }
}

3. 定义Realm模型

创建一个模型类,用于定义Realm数据库中的表结构。确保类继承自RealmObject并使用@primaryKey注解指定主键。

import 'package:realm_dart/realm_dart.dart';

part 'person.g.dart'; // 自动生成的文件

@RealmModel()
class Person extends RealmObject {
  @primaryKey
  String? id;
  String? name;
  int? age;
}

运行flutter pub run build_runner build来生成person.g.dart文件。

4. 执行CRUD操作

HomeScreen中执行CRUD操作。

import 'package:flutter/material.dart';
import 'package:realm_dart/realm_dart.dart';
import 'person.dart';

class HomeScreen extends StatefulWidget {
  final Realm realm;

  HomeScreen({required this.realm});

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  late Person person;

  @override
  void initState() {
    super.initState();

    // 创建对象
    person = Person()
      ..id = '1'
      ..name = 'John Doe'
      ..age = 30;

    // 写入数据库
    widget.realm.writeSync(() {
      widget.realm.add(person);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Realm Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 读取数据
            Text('Name: ${_readPerson()?.name ?? 'N/A'}'),
            Text('Age: ${_readPerson()?.age ?? 'N/A'}'),

            // 更新数据
            ElevatedButton(
              onPressed: () {
                widget.realm.writeSync(() {
                  final Person? existingPerson = _readPerson();
                  if (existingPerson != null) {
                    existingPerson.name = 'Jane Doe';
                    existingPerson.age = 28;
                  }
                });
                setState(() {}); // 刷新UI
              },
              child: Text('Update Person'),
            ),

            // 删除数据
            ElevatedButton(
              onPressed: () {
                widget.realm.writeSync(() {
                  final Person? existingPerson = _readPerson();
                  if (existingPerson != null) {
                    widget.realm.delete(existingPerson);
                  }
                });
                setState(() {}); // 刷新UI
              },
              child: Text('Delete Person'),
            ),
          ],
        ),
      ),
    );
  }

  // 读取数据
  Person? _readPerson() {
    return widget.realm.objects<Person>().firstWhereOrNull((p) => p.id == '1');
  }
}

总结

上述代码展示了如何在Flutter项目中使用realm_dart插件进行数据库管理。包括添加依赖、配置Realm、定义模型类以及执行CRUD操作。确保按照实际需求调整代码中的路径、模型定义和操作逻辑。

回到顶部