Flutter异步SQLite数据库操作插件sqlite3_async的使用
Flutter异步SQLite数据库操作插件sqlite3_async的使用
sqlite3_async
是一个为 sqlite3
插件提供异步操作功能的包。它支持诸如打开数据库、执行SQL命令、配置用户版本和获取最后插入行ID等异步操作。
特性
- 异步打开Sqlite数据库
- 异步执行SQL命令
- 配置数据库用户版本
- 获取最后插入行的ID
开始使用
首先,你需要在项目中添加 sqlite3_async
和 sqlite3_flutter_libs
依赖:
flutter pub add sqlite3_async
flutter pub add sqlite3_flutter_libs
对于其他平台的支持,请参阅 sqlite3 文档。
使用示例
下面是一个完整的Flutter应用示例,展示了如何使用 sqlite3_async
来进行基本的数据库操作,如创建表、插入数据以及查询数据。
示例代码
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:sqlite3_async/sqlite3_async.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const LoadingPage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
[@override](/user/override)
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final myController = TextEditingController();
List<String> items = [];
[@override](/user/override)
void dispose() {
myController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Home Page')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(controller: myController, decoration: const InputDecoration(labelText: "Item")),
),
ElevatedButton(onPressed: insertItem, child: const Text("Submit")),
Text("Items: ${items.toString()}"),
],
),
),
);
}
void insertItem() async {
await StorageUtils.addItem(myController.text);
var readItems = await StorageUtils.readItems();
setState(() {
items = readItems;
});
}
}
class LoadingPage extends StatelessWidget {
const LoadingPage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return FutureBuilder<void>(
future: StorageUtils.init(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else {
WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const HomePage()));
});
return Container();
}
},
);
}
}
class StorageUtils {
static AsyncDatabase? _itemsDb;
static Future<void> init() async {
final databaseDir = await path_provider.getApplicationSupportDirectory();
if (!await databaseDir.exists()) {
await databaseDir.create(recursive: true);
}
final dbPath = '${databaseDir.path}/items.db';
_itemsDb = await AsyncDatabase.open(dbPath);
await _itemsDb!.execute("DROP TABLE IF EXISTS items");
await _itemsDb!.execute("CREATE TABLE items(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
}
static Future<void> addItem(String name) => _itemsDb!.execute("INSERT INTO items(name) VALUES (?)", [name]);
static Future<List<String>> readItems() async {
return (await _itemsDb!.select("SELECT * FROM items")).map((e) => e["name"].toString()).toList();
}
}
更多关于Flutter异步SQLite数据库操作插件sqlite3_async的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter异步SQLite数据库操作插件sqlite3_async的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用sqlite3_async
插件进行异步SQLite数据库操作的示例代码。这个插件允许你以异步方式执行数据库操作,从而提高应用的性能和用户体验。
首先,你需要在你的pubspec.yaml
文件中添加sqlite3_async
依赖:
dependencies:
flutter:
sdk: flutter
sqlite3_async: ^x.y.z # 替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们编写一些示例代码来展示如何使用sqlite3_async
进行数据库操作。
示例代码
1. 初始化数据库和表
import 'package:flutter/material.dart';
import 'package:sqlite3_async/sqlite3_async.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SQLite3 Async Example'),
),
body: DatabaseDemo(),
),
);
}
}
class DatabaseDemo extends StatefulWidget {
@override
_DatabaseDemoState createState() => _DatabaseDemoState();
}
class _DatabaseDemoState extends State<DatabaseDemo> {
late DatabaseConnection _db;
@override
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
_db = await DatabaseConnection.open('example.db');
// 创建表(如果不存在)
await _db.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''');
}
@override
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () => _insertData(),
child: Text('Insert Data'),
),
);
}
Future<void> _insertData() async {
await _db.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30]);
await _db.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['Bob', 25]);
// 读取数据并显示
List<Map<String, dynamic>> result = await _db.query('SELECT * FROM users');
print(result);
}
@override
void dispose() {
_db.close();
super.dispose();
}
}
2. 解释代码
-
依赖导入和初始化:
- 在
pubspec.yaml
中添加sqlite3_async
依赖。 - 使用
import 'package:sqlite3_async/sqlite3_async.dart';
导入插件。
- 在
-
数据库连接:
- 使用
DatabaseConnection.open('example.db')
异步打开数据库连接。
- 使用
-
创建表:
- 使用
_db.execute
方法执行SQL语句来创建表(如果表不存在)。
- 使用
-
插入数据:
- 使用
_db.execute
方法插入数据。 - 使用占位符
?
来防止SQL注入,并传递参数列表。
- 使用
-
查询数据:
- 使用
_db.query
方法查询数据,并返回结果列表。
- 使用
-
清理资源:
- 在
dispose
方法中关闭数据库连接,以释放资源。
- 在
注意事项
- 确保在
initState
方法中初始化数据库连接,并在dispose
方法中关闭连接。 - 使用占位符和参数列表来防止SQL注入攻击。
- 异步操作可以提高应用的性能和用户体验。
希望这些示例代码能帮助你在Flutter项目中使用sqlite3_async
插件进行异步SQLite数据库操作。