Flutter数据库管理插件realm的使用
Flutter数据库管理插件realm的使用
警告
请注意,我们宣布了Atlas Device Sync + Realm SDKs的弃用,自2024年9月起。更多详情请参阅:
对于不包含同步功能的realm-dart
版本,请安装版本20或查看community
分支。
简介
Realm是一个直接在手机、平板电脑或可穿戴设备中运行的移动数据库。本仓库包含了Flutter™和Dart™的Realm SDK源代码。
功能特性
- 移动端优先:Realm是第一个从零开始构建以直接运行于手机、平板电脑和可穿戴设备中的数据库。
- 简单:Realm面向对象的数据模型易于学习,不需要ORM,并且API可以让你编写更少的代码,在几分钟内启动并运行应用程序。
- 现代:支持最新的Dart和Flutter版本,并采用严格的空安全机制。
- 快速:在常见的操作上比原始SQLite更快,同时保持极其丰富的功能集。
- MongoDB Atlas Device Sync:简化了用户、设备和后端之间数据的实时同步。可以通过模板应用免费开始使用,并创建云端后端。
快速入门
导入Realm并定义数据模型
import 'package:realm/realm.dart';
part 'app.realm.dart';
@RealmModel()
class _Car {
late String make;
late String model;
int? kilometers = 500;
}
生成RealmObject类
dart run realm generate
打开Realm并添加对象
var config = Configuration.local([Car.schema]);
var realm = Realm(config);
var car = Car("Tesla", "Model Y", kilometers: 5);
realm.write(() {
realm.add(car);
});
查询对象
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'");
监听查询结果的变化
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)));
示例代码
以下是一个完整的示例demo,展示了如何在Flutter项目中使用Realm进行数据库管理。
main.dart
// Copyright 2021 MongoDB, Inc.
// SPDX-License-Identifier: Apache-2.0
// ignore_for_file: avoid_print
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:realm/realm.dart';
part 'main.realm.dart';
@RealmModel()
class _Car {
late String make;
String? model;
int? kilometers = 500;
_Person? owner;
}
@RealmModel()
class _Person {
late String name;
int age = 1;
}
void main() {
print("Current PID $pid");
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late Realm realm;
_MyAppState() {
final config = Configuration.local([Car.schema, Person.schema]);
realm = Realm(config);
}
int get carsCount => realm.all<Car>().length;
@override
void initState() {
var myCar = Car("Tesla", model: "Model Y", kilometers: 1);
realm.write(() {
print('Adding a Car to Realm.');
var car = realm.add(Car("Tesla", owner: Person("John")));
print("Updating the car's model and kilometers");
car.model = "Model 3";
car.kilometers = 5000;
print('Adding another Car to Realm.');
realm.add(myCar);
print("Changing the owner of the car.");
myCar.owner = Person("me", age: 18);
print("The car has a new owner ${car.owner!.name}");
});
print("Getting all cars from the Realm.");
var cars = realm.all<Car>();
print("There are ${cars.length} cars in the Realm.");
var indexedCar = cars[0];
print('The first car is ${indexedCar.make} ${indexedCar.model}');
print("Getting all Tesla cars from the Realm.");
var filteredCars = realm.all<Car>().query("make == 'Tesla'");
print('Found ${filteredCars.length} Tesla cars');
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text('Running on: ${Platform.operatingSystem}.\n\nThere are $carsCount cars in the Realm.\n'),
),
),
);
}
}
文档与资源
- Realm Flutter API Docs
- Realm Dart API Docs
- Realm Flutter Samples
- Realm SDK Documentation
- Quick Start documentation
- App Services Overview
- Device Sync Overview
通过上述内容,您可以快速上手并在Flutter项目中使用Realm进行高效的数据库管理。如果您有任何问题或需要进一步的帮助,请参考官方文档或访问GitHub上的项目页面。
更多关于Flutter数据库管理插件realm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件realm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用Realm进行数据库管理可以显著提升应用的性能和开发效率。Realm是一个跨平台的移动数据库,它提供了强大的对象存储和查询功能,非常适合在Flutter项目中使用。以下是一个简单的示例,展示如何在Flutter中使用Realm数据库管理插件。
首先,确保你已经在Flutter项目中添加了Realm插件的依赖。打开你的pubspec.yaml
文件,并添加以下依赖:
dependencies:
flutter:
sdk: flutter
realm: ^x.y.z # 请替换为最新的Realm Flutter插件版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们将创建一个简单的Realm模型、初始化Realm实例并进行基本的CRUD(创建、读取、更新、删除)操作。
1. 创建Realm模型
创建一个新的Dart文件,比如models/person.dart
,并定义一个Realm模型:
import 'package:realm/realm.dart';
@RealmObject()
class Person extends RealmObject {
@PrimaryKey()
late int id;
late String name;
late int age;
// 构造函数
Person({required this.id, required this.name, required this.age});
}
2. 初始化Realm实例
在你的主应用文件(比如main.dart
)中,初始化Realm实例:
import 'package:flutter/material.dart';
import 'package:realm/realm.dart';
import 'models/person.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化Realm配置
final appConfig = RealmConfiguration.builder()
..schemaVersion(0) // 初始版本
..migrationBlock(Realm.migrationBlockForDefaultConfiguration)
.build();
// 打开Realm实例
await Realm.open(configuration: appConfig);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
3. 进行CRUD操作
在你的HomeScreen
组件中,进行基本的CRUD操作:
import 'package:flutter/material.dart';
import 'package:realm/realm.dart';
import 'models/person.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
late Realm realm;
@override
void initState() {
super.initState();
// 获取Realm实例
realm = Realm.current!;
// 在初始化时进行写操作(例如插入数据)
_writeData();
}
void _writeData() async {
await realm.writeAsync(() async {
realm.add(Person(id: 1, name: 'Alice', age: 30));
realm.add(Person(id: 2, name: 'Bob', age: 25));
});
}
void _readData() {
realm.objects<Person>().forEach((person) {
print('ID: ${person.id}, Name: ${person.name}, Age: ${person.age}');
});
}
void _updateData() async {
await realm.writeAsync(() async {
var person = realm.objects<Person>().where((p) => p.id == 1).findFirst()!;
person.age = 31;
});
}
void _deleteData() async {
await realm.writeAsync(() async {
var person = realm.objects<Person>().where((p) => p.id == 2).findFirst()!;
realm.delete(person);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Realm Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
_readData();
},
child: Text('Read Data'),
),
ElevatedButton(
onPressed: () {
_updateData();
},
child: Text('Update Data'),
),
ElevatedButton(
onPressed: () {
_deleteData();
},
child: Text('Delete Data'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Realm模型Person
,并在HomeScreen
组件中进行了基本的CRUD操作。注意,所有的写操作(添加、更新、删除)都需要在realm.writeAsync
块中进行,以确保线程安全。
请确保你已经正确配置了Realm,并根据需要调整代码以适应你的具体需求。这个示例只是一个基本的入门指南,Realm提供了更多高级功能和配置选项,你可以查阅官方文档以获取更多信息。