Flutter本地数据库管理插件rxdb的使用

Flutter本地数据库管理插件RxDB的使用

在移动应用开发的世界里,由于其跨平台能力和丰富的UI框架,Flutter已经获得了显著的流行。当构建功能丰富的Flutter应用程序时,选择一个强大且高效的数据库至关重要。在这篇文章中,我们将探讨RxDB作为Flutter应用程序的数据库解决方案。我们将会深入了解RxDB的核心功能、优势以及如何将其集成到Flutter应用中。

注意事项:你可以在GitHub仓库中找到一个RxDB Flutter应用的源代码示例

在这里

Flutter移动应用概述

Flutter是由Google开发的开源UI软件开发工具包,它允许开发者使用单一代码库为iOS和Android平台构建高性能的移动应用。Flutter的框架提供了大量的小部件和工具,使开发者能够创建视觉上吸引人且响应灵敏的应用程序。

数据库在Flutter应用中的重要性

数据库在Flutter应用中扮演着至关重要的角色,通过提供持久可靠的存储解决方案来存储和检索数据。无论是用户配置文件、应用设置还是复杂的数据结构,数据库都有助于高效管理和组织应用的数据。选择适合Flutter应用的正确数据库可以显著影响应用的性能、可扩展性和用户体验。

引入RxDB作为数据库解决方案

RxDB是一个强大的NoSQL数据库解决方案,专为JavaScript框架设计,如Flutter。它被称为反应式数据库,提供了一系列功能,使其成为构建Flutter应用的理想选择。RxDB结合了JavaScript文档型数据库模型的简单性和反应式编程范式的优点,使开发者能够轻松构建实时和离线优先的应用程序。

开始使用RxDB

为了理解如何在Flutter应用中使用RxDB,让我们探索其核心特性和优势。

RxDB是什么?

RxDB是一个基于IndexedDB的客户端侧数据库。IndexedDB是一种低级别的浏览器端数据库API。它提供了一个简单直观的API来执行CRUD操作(创建、读取、更新、删除)文档。RxDB的底层架构允许其高效地处理多客户端与服务器之间的数据同步。

反应式数据处理

RxDB的一个关键优势是其反应式数据处理能力。它利用观察者(Observables)的概念,这是反应式编程的一部分,自动更新UI以响应数据变化。通过RxDB,开发者可以定义查询并订阅结果,确保UI始终与数据库保持同步。

离线优先方法

RxDB采用离线优先的方法,非常适合需要在无互联网连接情况下运行的Flutter应用。它允许数据在本地存储,并在有网络连接时无缝同步到服务器。这确保了用户无论是否有网络连接都可以访问和互动他们的数据。

数据复制

数据复制是构建分布式应用的关键部分。RxDB提供了强大的复制功能,使不同客户端和服务器之间能够同步数据。通过其复制插件,RxDB简化了实时数据同步的设置过程,确保所有连接设备的一致性。

可观察查询

RxDB引入了可观察查询的概念,即当基础数据发生变化时,这些查询会自动更新。此功能特别适用于保持UI与最新数据同步。通过订阅可观察查询,开发者可以接收实时更新,并无需手动干预即可反映在用户界面上。

RxDB与其他Flutter数据库选项比较

在考虑Flutter应用的数据库选项时,开发者通常会遇到诸如SQLite或LokiJS等替代方案。虽然这些数据库有它们的优点,但RxDB相对于它们有几个优势。RxDB与Flutter的无缝集成、离线优先的方法、反应式数据处理以及内置的数据复制使其成为构建功能丰富且可扩展的Flutter应用的理想选择。

在Flutter应用中使用RxDB

现在我们了解了RxDB的核心功能,让我们探索如何将其集成到Flutter应用中。

如何在Flutter中运行RxDB

RxDB用TypeScript编写并编译成JavaScript。要在Flutter应用中运行RxDB,使用flutter_qjs库来启动QuickJS JavaScript运行时。RxDB本身在该运行时中运行并与Flutter Dart运行时通信。为了持久存储数据,使用LokiJS RxStorage与一个自定义存储适配器一起将数据库保存在shared_preferences数据中。

要使用RxDB,你需要创建一个兼容的JavaScript文件,在其中创建你的RxDatabase并启动一些用于Flutter通过setFlutterRxDatabaseConnector()与JavaScript RxDB数据库通信的连接器。

import {
    createRxDatabase
} from 'rxdb';
import {
    getRxStorageLoki
} from 'rxdb/plugins/storage-lokijs';
import {
    setFlutterRxDatabaseConnector,
    getLokijsAdapterFlutter
} from 'rxdb/plugins/flutter';

// 在此方法中进行所有数据库创建操作。
async function createDB(databaseName) {
    // 创建RxDatabase
    const db = await createRxDatabase({
        // 数据库名称是变量,因此可以在Flutter端更改
        name: databaseName,
        storage: getRxStorageLoki({
            adapter: getLokijsAdapterFlutter()
        }),
        multiInstance: false
    });
    await db.addCollections({
        heroes: {
            schema: {
                version: 0,
                primaryKey: 'id',
                type: 'object',
                properties: {
                    id: {
                        type: 'string',
                        maxLength: 100
                    },
                    name: {
                        type: 'string',
                        maxLength: 100
                    },
                    color: {
                        type: 'string',
                        maxLength: 30
                    }
                },
                indexes: ['name'],
                required: ['id', 'name', 'color']
            }
        }
    });
    return db;
}

// 启动连接器,以便Flutter可以与JavaScript进程通信
setFlutterRxDatabaseConnector(
    createDB
);

在使用JavaScript代码之前,必须将其捆绑到单个.js文件中。在这个例子中,我们使用webpack在一个npm脚本中进行捆绑,将所有内容捆绑到javascript/dist/index.js文件中。

为了让Flutter在运行时访问该文件,将其添加到pubspec.yaml文件中的资源列表中:

flutter:
  assets:
    - javascript/dist/index.js

此外,你还需要在Flutter应用部分安装RxDB。首先,你必须将rxdb作为Flutter依赖项使用。目前,该包尚未发布到dart pub.dev。相反,你必须从本地文件系统中安装它,位于你的RxDB npm安装目录内。

# 在pubspec.yaml中
dependencies:
  rxdb:
    path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart

之后,你可以在Dart代码中导入RxDB库,并从此处连接到JavaScript进程。以下是lib/main.dart文件的参考。

import 'package:rxdb/rxdb.dart';

// 启动JavaScript进程并连接到数据库
RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName);

// 获取集合
RxCollection collection = database.getCollection('heroes');

// 插入文档
RxDocument document = await collection.insert({
    "id": "zflutter-${DateTime.now()}",
    "name": nameController.text,
    "color": colorController.text
});

// 创建查询
RxQuery<RxHeroDocType> query = RxDatabaseState.collection.find();

// 创建查询结果列表
List<RxDocument<RxHeroDocType>> documents = [];

// 订阅查询
query.$().listen((results) {
    setState(() {
        documents = results;
    });
});

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

1 回复

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


RxDB 是一个基于 RxJS 的 NoSQL 数据库,它支持离线优先、实时同步和跨平台使用。虽然 RxDB 主要设计用于 JavaScript 应用(如 React、Vue.js 等),但你可以通过 Flutter 的 flutter_webview_pluginflutter_inappwebview 插件在 Flutter 应用中使用 RxDB。

以下是如何在 Flutter 应用中使用 RxDB 的基本步骤:

1. 创建一个新的 Flutter 项目

首先,创建一个新的 Flutter 项目:

flutter create rxdb_flutter_example
cd rxdb_flutter_example

2. 添加依赖

pubspec.yaml 中添加 flutter_inappwebview 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_inappwebview: ^5.3.2

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

3. 创建 HTML 文件

assets 目录下创建一个名为 index.html 的文件,并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>RxDB Example</title>
    <script src="https://cdn.jsdelivr.net/npm/rxdb@latest/dist/rxdb.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/rxdb@latest/dist/plugins/pouchdb.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/pouchdb@latest/dist/pouchdb.min.js"></script>
</head>
<body>
    <button id="create">Create Document</button>
    <button id="query">Query Documents</button>
    <div id="output"></div>
    <script>
        async function run() {
            const db = await RxDB.create({
                name: 'mydatabase',
                adapter: 'pouchdb',
                multiInstance: true,
                ignoreDuplicate: true
            });

            const schema = {
                version: 0,
                type: 'object',
                properties: {
                    name: {
                        type: 'string'
                    },
                    age: {
                        type: 'number'
                    }
                }
            };

            await db.collection({
                name: 'heroes',
                schema
            });

            document.getElementById('create').addEventListener('click', async () => {
                await db.heroes.insert({
                    name: 'Batman',
                    age: 45
                });
                document.getElementById('output').innerText = 'Document created!';
            });

            document.getElementById('query').addEventListener('click', async () => {
                const docs = await db.heroes.find().exec();
                document.getElementById('output').innerText = JSON.stringify(docs, null, 2);
            });
        }

        run();
    </script>
</body>
</html>

4. 在 Flutter 中加载 HTML 文件

lib/main.dart 中,创建一个 InAppWebView 来加载这个 HTML 文件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('RxDB Example')),
        body: InAppWebView(
          initialFile: "assets/index.html",
          initialOptions: InAppWebViewGroupOptions(
            android: AndroidInAppWebViewOptions(
              builtInZoomControls: true,
            ),
          ),
        ),
      ),
    );
  }
}

5. 配置 Android 和 iOS

android/app/src/main/AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />

对于 iOS,确保在 Info.plist 中添加以下内容:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

6. 运行应用

现在可以运行你的 Flutter 应用:

flutter run
回到顶部