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

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

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

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  scientisst_db: ^0.1.2

架构

数据库存储在应用程序文档目录中,该目录由 path_provider 提供。

数据库目录存储在一个名为 scientisst_db 的根文件夹中。

第一层仅包含 collections,每个 collection 都有一个对应的目录。每个 collection 目录由三个独立的文件夹组成:collectionsdocumentsmetadatacollection 的子 documents 存储在 documents 文件夹中,每个 document 都有自己的文件,文件名与 ObjectId 对应。ObjectId 是根据 MongoDB 的标准生成的,也可以是一个任意的 Stringdocument 数据以 JSON 格式存储在文本文件中。

每个 document 都有一个对应的 metadata 文件,存储在 collection 目录内的 metadata 文件夹中,文件名与 ObjectId 相同,并且也是以 JSON 格式编码的。

一个 document 可以存储 collections(子集合),这些 collections 存储在父 collection 目录下的 collections 文件夹内。这个文件夹的文件名与 documentObjectId 相同,并遵循相同的 collection 结构。

示例

完整的示例可以查看 这里

一些基本示例:

添加文档到集合

DocumentReference doc = await ScientISSTdb.instance.collection("movies").add(
  {
    "title": "Eternal Sunshine of the Spotless Mind",
    "year": 2004,
    "characters": [
      "Joel",
      "Clementine",
    ],
  },
);

更新文档

await doc.update(
  {
    "title": "Hello world",
  },
);

删除文档

await ScientISSTdb.instance.collection("movies").document("507f1f77bcf86cd7994ca120").delete();

获取集合中的所有文档

await ScientISSTdb.instance.collection("movies").getDocuments();

按字段值排序文档

await ScientISSTdb.instance
    .collection("movies")
    .orderBy("year", ascending: false)
    .getDocuments();

示例代码

以下是在 main.dart 中使用 scientisst_db 插件的基本示例:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Example(),
    );
  }
}

class Example extends StatefulWidget {
  [@override](/user/override)
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  [@override](/user/override)
  void initState() {
    super.initState();
    generateDB();
  }

  void generateDB() async {
    // 清除数据库
    await ScientISSTdb.clearDatabase(confirm: true);

    // 添加电影数据
    await ScientISSTdb.instance.collection("movies").add(
      {
        "title": "Eternal Sunshine of the Spotless Mind",
        "year": 2004,
        "characters": [
          "Joel",
          "Clementine",
        ],
      },
    );

    // 添加另一部电影及其演员
    DocumentReference inception = await ScientISSTdb.instance.collection("movies").add(
      {
        "title": "Inception",
        "year": 2010,
        "characters": [
          "Cobb",
          "Arthur",
          "Ariadne",
        ],
      },
    );

    await ScientISSTdb.instance
        .collection("movies")
        .document(inception.id)
        .collection("actors")
        .add(
      {
        "name": "Leonardo DiCaprio",
        "birthdate": DateTime(1974, 10, 11),
      },
    );

    await ScientISSTdb.instance
        .collection("movies")
        .document(inception.id)
        .collection("actors")
        .add(
      {
        "name": "Joseph Gordon-Levitt",
        "birthdate": DateTime(1981, 2, 17),
      },
    );

    // 更新UI状态
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Movies"),
      ),
      body: SafeArea(
        child: FutureBuilder(
          future: ScientISSTdb.instance
              .collection("movies")
              .orderBy("year", descending: false)
              .getDocuments(),
          builder: (BuildContext context,
              AsyncSnapshot<List<DocumentSnapshot>> snap) {
            if (snap.hasError || snap.data == null)
              return Container();
            else
              return ListView.builder(
                itemCount: snap.data!.length,
                itemBuilder: (BuildContext context, int index) => ListTile(
                  title: Text(
                    snap.data![index].data["title"],
                  ),
                  subtitle: Text(
                    snap.data![index].data["year"].toString(),
                  ),
                ),
              );
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 scientist_db 插件在 Flutter 中进行数据库管理的代码示例。scientist_db 是一个用于管理 SQLite 数据库的 Flutter 插件,它提供了一套简单的 API 来执行常见的数据库操作。

首先,你需要在 pubspec.yaml 文件中添加 scientist_db 依赖:

dependencies:
  flutter:
    sdk: flutter
  scientist_db: ^最新版本号  # 请替换为实际的最新版本号

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

接下来是一个完整的 Flutter 应用示例,展示了如何使用 scientist_db 进行基本的数据库操作:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Scientist DB Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ScientistDB _db;

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

  Future<void> _initDatabase() async {
    // 初始化数据库
    _db = ScientistDB(
      databaseName: 'demo.db',
      version: 1,
    );

    // 创建表
    await _db.createTable(
      tableName: 'users',
      columns: [
        ColumnInfo(name: 'id', type: ColumnType.integer, primaryKey: true, autoIncrement: true),
        ColumnInfo(name: 'name', type: ColumnType.text, notNull: true),
        ColumnInfo(name: 'email', type: ColumnType.text, unique: true),
      ],
    );
  }

  Future<void> _insertUser(String name, String email) async {
    await _db.insert(
      tableName: 'users',
      values: {
        'name': name,
        'email': email,
      },
    );
  }

  Future<List<Map<String, dynamic>>> _queryUsers() async {
    return await _db.query(tableName: 'users');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scientist DB Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () async {
                await _insertUser('John Doe', 'john@example.com');
                setState(() {}); // 刷新界面
              },
              child: Text('Insert User'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                List<Map<String, dynamic>> users = await _queryUsers();
                // 打印用户列表
                users.forEach((user) => print(user));

                // 可以在这里显示用户列表,为了简单起见,这里只打印出来
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('Fetched ${users.length} users'),
                  ),
                );
              },
              child: Text('Query Users'),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖管理

    • pubspec.yaml 中添加 scientist_db 依赖。
  2. 数据库初始化

    • initState 方法中调用 _initDatabase 方法来初始化数据库并创建表。
  3. 创建表

    • 使用 _db.createTable 方法来创建一个名为 users 的表,包含 idnameemail 列。
  4. 插入数据

    • 使用 _db.insert 方法向 users 表中插入一条记录。
  5. 查询数据

    • 使用 _db.query 方法从 users 表中查询所有记录,并打印出来。
  6. UI

    • 使用 ElevatedButton 创建两个按钮,一个用于插入用户数据,另一个用于查询并显示用户数据。

这个示例展示了如何使用 scientist_db 插件进行基本的数据库操作。根据实际需求,你可以进一步扩展这个示例,比如添加更多的表、列、以及更复杂的查询和更新操作。

回到顶部