Flutter数据库管理插件unpub_sqlite的使用
Flutter数据库管理插件unpub_sqlite的使用
unpub_sqlite
是一个用于在本地 SQLite 数据库中存储包元数据的插件。它实现了 unpub
的 MetaStore
接口。
动机
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}');
}
代码说明
-
导入必要的库:
import 'package:sqlite3/sqlite3.dart'; import 'package:unpub/unpub.dart' as unpub; import 'package:unpub_sqlite/src/sqlite_meta_store.dart';
-
打印 SQLite 版本:
print('Using sqlite3 ${sqlite3.version}');
-
打开 SQLite 数据库:
final db = sqlite3.open('test.db');
-
创建并初始化
SqliteMetaStore
:final metaStore = SqliteMetaStore(sqliteDatabase: db); metaStore.initialize();
-
创建
App
实例: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}');
更多关于Flutter数据库管理插件unpub_sqlite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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']);
}
}