Flutter异步SQLite数据库操作插件sqlite3_async的使用

Flutter异步SQLite数据库操作插件sqlite3_async的使用

sqlite3_async 是一个为 sqlite3 插件提供异步操作功能的包。它支持诸如打开数据库、执行SQL命令、配置用户版本和获取最后插入行ID等异步操作。

特性

  • 异步打开Sqlite数据库
  • 异步执行SQL命令
  • 配置数据库用户版本
  • 获取最后插入行的ID

开始使用

首先,你需要在项目中添加 sqlite3_asyncsqlite3_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

1 回复

更多关于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. 解释代码

  1. 依赖导入和初始化

    • pubspec.yaml中添加sqlite3_async依赖。
    • 使用import 'package:sqlite3_async/sqlite3_async.dart';导入插件。
  2. 数据库连接

    • 使用DatabaseConnection.open('example.db')异步打开数据库连接。
  3. 创建表

    • 使用_db.execute方法执行SQL语句来创建表(如果表不存在)。
  4. 插入数据

    • 使用_db.execute方法插入数据。
    • 使用占位符?来防止SQL注入,并传递参数列表。
  5. 查询数据

    • 使用_db.query方法查询数据,并返回结果列表。
  6. 清理资源

    • dispose方法中关闭数据库连接,以释放资源。

注意事项

  • 确保在initState方法中初始化数据库连接,并在dispose方法中关闭连接。
  • 使用占位符和参数列表来防止SQL注入攻击。
  • 异步操作可以提高应用的性能和用户体验。

希望这些示例代码能帮助你在Flutter项目中使用sqlite3_async插件进行异步SQLite数据库操作。

回到顶部