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

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

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'),
        ),
      ),
    );
  }
}

文档与资源

通过上述内容,您可以快速上手并在Flutter项目中使用Realm进行高效的数据库管理。如果您有任何问题或需要进一步的帮助,请参考官方文档或访问GitHub上的项目页面。


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

1 回复

更多关于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提供了更多高级功能和配置选项,你可以查阅官方文档以获取更多信息。

回到顶部