Flutter数据库管理插件sqlite_wrapper的使用
Flutter数据库管理插件sqlite_wrapper的使用
sqlite_wrapper
是一个简单的 SQLite3 绑定包装库,基于 sqlite3 包。它旨在简化与 SQLite 数据库的工作,提供了一个易于使用的 API,并支持多平台(iOS、Android、MacOS、Windows、Web)。
主要特性
- 无样板代码
- 无需生成代码
- 提供响应式 API
- 简化模型对象的转换
- 完全支持 SQL 语言特性
- 全面测试的代码
- 多平台支持
- 没有复杂的魔法,API 简单易用
功能
- 连接到 SQLite 数据库
- 执行 SQL 语句
- 使用编码和解码映射或模型对象操作数据库
- 通过流实时更新特定查询结果
- 同时管理多个数据库
- 在数据库创建或迁移时执行回调
开始使用
安装依赖
-
添加
sqlite_wrapper
包到pubspec.yaml
文件中:dependencies: sqlite_wrapper: ^latest_version
-
如果需要在 iOS 和 MacOS 上使用最新版本的 SQLite,请安装并配置
sqlite3_flutter_libs
包。 -
如果要在 Flutter Web 中使用该库,请安装并配置
sqflite_common_ffi_web
包,并运行以下命令生成必要的文件:$ dart run sqflite_common_ffi_web:setup --force
使用示例
初始化数据库
首先,我们需要初始化数据库并创建表:
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqlite_wrapper/sqlite_wrapper.dart';
Future<void> initDB() async {
final docDir = await getApplicationDocumentsDirectory();
if (!await docDir.exists()) {
await docDir.create(recursive: true);
}
await SQLiteWrapper().openDB(p.join(docDir.path, "todoDatabase.sqlite"));
const String createTableSQL = """
CREATE TABLE IF NOT EXISTS "todos" (
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"title" varchar(255) NOT NULL,
"done" int default 0
);
""";
await SQLiteWrapper().execute(createTableSQL);
}
插入数据
Map<String, dynamic> todo = {"title": "New Todo", "done": 0};
int id = await SQLiteWrapper().insert(todo, "todos");
print('Inserted row with id: $id');
查询数据
单条记录查询
Map? todoMap = await SQLiteWrapper().query(
"SELECT * FROM todos WHERE id = ?",
params: [1],
singleResult: true,
);
print(todoMap);
多条记录查询
List<Map> todos = await SQLiteWrapper().query("SELECT * FROM todos");
print(todos);
更新数据
Map<String, dynamic> updatedTodo = {"id": 1, "title": "Updated Todo", "done": 1};
int affectedRows = await SQLiteWrapper().update(updatedTodo, "todos", keys: ["id"]);
print('Updated $affectedRows rows');
删除数据
int deletedRows = await SQLiteWrapper().delete({"id": 1}, "todos", keys: ["id"]);
print('Deleted $deletedRows rows');
监听数据变化
Stream stream = SQLiteWrapper().watch(
"SELECT COUNT(*) FROM todos",
singleResult: true,
tables: ["todos"],
);
stream.listen((event) {
print('Count of todos: $event');
});
示例项目
下面是一个完整的 Flutter 应用示例,展示如何使用 sqlite_wrapper
插件来管理待办事项列表。
import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqlite_wrapper/sqlite_wrapper.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化数据库
await initDB();
runApp(const MyApp());
}
Future<void> initDB() async {
final docDir = await getApplicationDocumentsDirectory();
if (!await docDir.exists()) {
await docDir.create(recursive: true);
}
await SQLiteWrapper().openDB(p.join(docDir.path, "todoDatabase.sqlite"));
const String createTableSQL = """
CREATE TABLE IF NOT EXISTS "todos" (
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"title" varchar(255) NOT NULL,
"done" int default 0
);
""";
await SQLiteWrapper().execute(createTableSQL);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'SQLiteWrapper Sample',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const HomePage(title: 'Todos'),
);
}
}
class HomePage extends StatefulWidget {
final String title;
const HomePage({super.key, required this.title});
[@override](/user/override)
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<Map<String, dynamic>> todos = [];
[@override](/user/override)
void initState() {
super.initState();
loadTodos();
}
Future<void> loadTodos() async {
List<Map> loadedTodos = await SQLiteWrapper().query("SELECT * FROM todos");
setState(() {
todos = loadedTodos.cast<Map<String, dynamic>>();
});
}
void addTodo(String title) async {
Map<String, dynamic> newTodo = {"title": title, "done": 0};
await SQLiteWrapper().insert(newTodo, "todos");
loadTodos();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: todos.length,
itemBuilder: (context, index) {
final todo = todos[index];
return ListTile(
title: Text(todo['title']),
trailing: Checkbox(
value: todo['done'] == 1,
onChanged: (value) {
todo['done'] = value! ? 1 : 0;
SQLiteWrapper().update(todo, "todos", keys: ["id"]);
loadTodos();
},
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
addTodo("New Todo");
},
tooltip: 'Add new todo',
child: const Icon(Icons.add),
),
);
}
}
更多关于Flutter数据库管理插件sqlite_wrapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件sqlite_wrapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用sqlite_wrapper
插件进行数据库管理的代码示例。sqlite_wrapper
是一个Flutter插件,它提供了对SQLite数据库的简单封装,使得在Flutter应用中管理数据库变得更加容易。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加sqlite_wrapper
的依赖:
dependencies:
flutter:
sdk: flutter
sqlite_wrapper: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 初始化数据库
在你的Flutter应用中,你需要初始化数据库并打开一个数据库连接。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:sqlite_wrapper/sqlite_wrapper.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter SQLite Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late DatabaseHelper _dbHelper;
@override
void initState() {
super.initState();
_dbHelper = DatabaseHelper();
_dbHelper.initializeDatabase().then((_) {
// 数据库初始化完成后的操作
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite Demo'),
),
body: Center(
child: Text('数据库初始化中...'),
),
);
}
}
class DatabaseHelper {
Database? _database;
Future<void> initializeDatabase() async {
_database = await openDatabase(
join(await getDatabasesPath(), 'demo.db'),
onCreate: (db, version) async {
// 在这里创建表
await db.execute(
'CREATE TABLE users ('
'id INTEGER PRIMARY KEY AUTOINCREMENT,'
'name TEXT NOT NULL,'
'email TEXT NOT NULL UNIQUE'
')',
);
},
version: 1,
);
}
// 后续可以添加插入、查询、更新、删除等方法
}
3. 插入数据
下面是一个插入数据的示例方法:
class DatabaseHelper {
// ... 其他代码 ...
Future<void> insertUser(String name, String email) async {
final db = _database!;
await db.insert(
'users',
{'name': name, 'email': email},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
}
你可以在_MyHomePageState
的某个地方调用这个方法,比如在按钮点击事件中:
class _MyHomePageState extends State<MyHomePage> {
// ... 其他代码 ...
void _insertSampleData() {
_dbHelper.insertUser('Alice', 'alice@example.com');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _insertSampleData,
child: Text('插入数据'),
),
),
);
}
}
4. 查询数据
下面是一个查询数据的示例方法:
class DatabaseHelper {
// ... 其他代码 ...
Future<List<Map<String, dynamic>>> getUsers() async {
final db = _database!;
final result = await db.query('users');
return result;
}
}
你可以在_MyHomePageState
中调用这个方法,并在UI中显示结果:
class _MyHomePageState extends State<MyHomePage> {
// ... 其他代码 ...
Future<void> _loadUsers() async {
final users = await _dbHelper.getUsers();
// 更新UI,例如使用setState
setState(() {
// 假设有一个_users列表保存用户数据
_users = users;
});
}
List<Map<String, dynamic>> _users = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite Demo'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _loadUsers,
child: Text('加载用户'),
),
Expanded(
child: _users.isEmpty
? Center(child: Text('没有用户数据'))
: ListView.builder(
itemCount: _users.length,
itemBuilder: (context, index) {
final user = _users[index];
return ListTile(
title: Text('${user['name']} (${user['email']})'),
);
},
),
),
],
),
);
}
}
总结
以上代码展示了如何在Flutter项目中使用sqlite_wrapper
插件进行基本的数据库管理操作,包括初始化数据库、插入数据和查询数据。你可以根据这些示例进一步扩展你的应用,添加更多的数据库操作功能。