Flutter数据库管理插件realm_dart的使用
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
- 在cloud.mongodb.com创建账户。
- 创建一个新的App。
- 配置适当的认证提供者类型。
- 在“Device Sync”菜单中启用Flexible Sync。
- 复制应用程序的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
更多关于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操作。确保按照实际需求调整代码中的路径、模型定义和操作逻辑。