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

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

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

unpub_sqlite 是一个用于在本地 SQLite 数据库中存储包元数据的插件。它实现了 unpubMetaStore 接口。

动机

unpub 是一个用于自托管 Dart 包仓库的解决方案。然而,它强制依赖于 MongoDB,这可能对那些不想运行额外服务的人来说是个障碍。由于 unpub 已经支持将包存储在文件系统上,用 SQLite 替换 MongoDB 可以使 unpub 更加轻量级,并且无需依赖其他服务(这些服务通常比 unpub 本身更重)。

特性与缺失特性

  • ✅ 自动初始化新的 SQLite 数据库
  • ❌ SQLite 数据库版本之间的迁移
  • ✅ 存储包及其版本
  • ✅ 存储上传者信息
  • ✅ 按关键词查询包
  • ❌ 按上传者查询包
  • ❌ 按依赖查询包
  • ❌ 任何测试覆盖率
  • ❌ 安全增强 – 异常泄露到 HTTP 响应等

免责声明

unpub 项目本身目前完全被遗弃(最后更新于 2021 年),这个插件也可能面临相同命运。这个插件是为满足个人需求而创建的,某些功能可能不完整或缺失。

欢迎提交问题,但请不要期望它们会迅速或完全解决。通过拉取请求进行贡献是高度鼓励的,毕竟它只是一个单文件的包!

资源

示例代码

以下是使用 unpub_sqlite 插件的完整示例代码:

import 'package:sqlite3/sqlite3.dart';
import 'package:unpub/unpub.dart' as unpub;
import 'package:unpub_sqlite/src/sqlite_meta_store.dart';

void main(List<String> args) async {
  print('Using sqlite3 ${sqlite3.version}');

  // 创建一个新的内存数据库。要使用由文件支持的数据库,可以将其替换为 sqlite3.open(yourFilePath)。
  final db = sqlite3.open('test.db');

  final metaStore = SqliteMetaStore(sqliteDatabase: db);
  metaStore.initialize();

  final app = unpub.App(
    metaStore: metaStore,
    packageStore: unpub.FileStore('./unpub-packages'),
    overrideUploaderEmail: 'software@dronetag.com',
  );

  final server = await app.serve('0.0.0.0', 4000);
  print('Serving server at http://${server.address.host}:${server.port}');
}

代码说明

  1. 导入必要的库

    import 'package:sqlite3/sqlite3.dart';
    import 'package:unpub/unpub.dart' as unpub;
    import 'package:unpub_sqlite/src/sqlite_meta_store.dart';
    
  2. 打印 SQLite 版本

    print('Using sqlite3 ${sqlite3.version}');
    
  3. 打开 SQLite 数据库

    final db = sqlite3.open('test.db');
    
  4. 创建并初始化 SqliteMetaStore

    final metaStore = SqliteMetaStore(sqliteDatabase: db);
    metaStore.initialize();
    
  5. 创建 App 实例

    final app = unpub.App(
      metaStore: metaStore,
      packageStore: unpub.FileStore('./unpub-packages'),
      overrideUploaderEmail: 'software@dronetag.com',
    );
    
  6. 启动服务器

    final server = await app.serve('0.0.0.0', 4000);
    print('Serving server at http://${server.address.host}:${server.port}');
    

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

1 回复

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


unpub_sqlite 是一个 Flutter 插件,用于在 Flutter 应用中使用 SQLite 数据库。SQLite 是一种轻量级的嵌入式数据库,非常适合在移动应用中使用。unpub_sqlite 提供了一个简单的 API 来管理 SQLite 数据库的创建、查询、插入、更新和删除操作。

以下是如何在 Flutter 项目中使用 unpub_sqlite 插件的详细步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 unpub_sqlite 依赖:

dependencies:
  flutter:
    sdk: flutter
  unpub_sqlite: ^0.1.0  # 请检查最新版本

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

2. 初始化数据库

在使用数据库之前,你需要初始化数据库并创建表。通常,你可以在应用的启动阶段进行这些操作。

import 'package:unpub_sqlite/unpub_sqlite.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化数据库
  final db = await UnpubSqlite.openDatabase('my_database.db');

  // 创建表
  await db.execute('''
    CREATE TABLE IF NOT EXISTS users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      age INTEGER
    )
  ''');

  runApp(MyApp(db));
}

3. 插入数据

你可以使用 execute 方法或 insert 方法来插入数据。

void insertUser(Database db) async {
  await db.execute('''
    INSERT INTO users (name, age) VALUES (?, ?)
  ''', ['Alice', 30]);

  // 或者使用 insert 方法
  await db.insert('users', {'name': 'Bob', 'age': 25});
}

4. 查询数据

你可以使用 query 方法来查询数据。

void queryUsers(Database db) async {
  List<Map<String, dynamic>> users = await db.query('users');

  for (var user in users) {
    print('User: ${user['name']}, Age: ${user['age']}');
  }
}

5. 更新数据

你可以使用 update 方法来更新数据。

void updateUser(Database db) async {
  await db.update('users', {'age': 35}, where: 'name = ?', whereArgs: ['Alice']);
}

6. 删除数据

你可以使用 delete 方法来删除数据。

void deleteUser(Database db) async {
  await db.delete('users', where: 'name = ?', whereArgs: ['Bob']);
}

7. 关闭数据库

在应用退出时,建议关闭数据库以释放资源。

void closeDatabase(Database db) async {
  await db.close();
}

8. 完整示例

以下是一个完整的 Flutter 应用示例,展示了如何使用 unpub_sqlite 插件进行数据库操作。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final db = await UnpubSqlite.openDatabase('my_database.db');

  await db.execute('''
    CREATE TABLE IF NOT EXISTS users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      age INTEGER
    )
  ''');

  runApp(MyApp(db));
}

class MyApp extends StatelessWidget {
  final Database db;

  MyApp(this.db);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SQLite Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () => insertUser(db),
                child: Text('Insert User'),
              ),
              ElevatedButton(
                onPressed: () => queryUsers(db),
                child: Text('Query Users'),
              ),
              ElevatedButton(
                onPressed: () => updateUser(db),
                child: Text('Update User'),
              ),
              ElevatedButton(
                onPressed: () => deleteUser(db),
                child: Text('Delete User'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void insertUser(Database db) async {
    await db.execute('''
      INSERT INTO users (name, age) VALUES (?, ?)
    ''', ['Alice', 30]);

    await db.insert('users', {'name': 'Bob', 'age': 25});
  }

  void queryUsers(Database db) async {
    List<Map<String, dynamic>> users = await db.query('users');

    for (var user in users) {
      print('User: ${user['name']}, Age: ${user['age']}');
    }
  }

  void updateUser(Database db) async {
    await db.update('users', {'age': 35}, where: 'name = ?', whereArgs: ['Alice']);
  }

  void deleteUser(Database db) async {
    await db.delete('users', where: 'name = ?', whereArgs: ['Bob']);
  }
}
回到顶部