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

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

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

简介

sqflite_darwinsqflite 插件在 iOS 和 MacOS 平台上的实现。它允许你在这些平台上使用 SQLite 数据库进行数据存储和管理。

示例代码

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 sqflite_darwin 插件来创建和管理 SQLite 数据库。

// 导入必要的包
import 'package:sqflite/sqflite.dart'; // sqflite 包
import 'package:path/path.dart'; // 用于处理文件路径
import 'package:flutter/material.dart';

void main() async {
  // 确保在运行任何异步操作之前初始化Flutter框架
  WidgetsFlutterBinding.ensureInitialized();

  // 获取数据库实例
  final database = await getDatabaseInstance();

  // 运行应用
  runApp(MyApp(database: database));
}

// 创建一个简单的应用程序
class MyApp extends StatelessWidget {
  final Database database;

  MyApp({required this.database});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sqflite Darwin Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Sqflite Darwin Example', database: database),
    );
  }
}

// 创建主页面
class MyHomePage extends StatefulWidget {
  final String title;
  final Database database;

  MyHomePage({required this.title, required this.database});

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  // 初始化状态时创建表
  [@override](/user/override)
  void initState() {
    super.initState();
    _createTable();
  }

  // 创建表的方法
  Future<void> _createTable() async {
    await widget.database.execute(
      '''
      CREATE TABLE IF NOT EXISTS Test (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        counter INTEGER
      )
      '''
    );
  }

  // 增加计数器并更新数据库
  void _incrementCounter() async {
    setState(() {
      _counter++;
    });

    // 更新数据库中的计数器值
    await widget.database.rawUpdate(
      'UPDATE Test SET counter = ? WHERE id = ?',
      [_counter, 1],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

// 获取数据库实例的方法
Future<Database> getDatabaseInstance() async {
  // 获取数据库路径
  var databasesPath = await getDatabasesPath();
  String path = join(databasesPath, 'demo.db');

  // 打开数据库
  return await openDatabase(path, version: 1,
      onCreate: (Database db, int version) async {
    // 当数据库被创建时执行此回调函数
    await db.execute(
      '''
      CREATE TABLE Test (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        counter INTEGER
      )
      '''
    );

    // 插入初始数据
    await db.insert('Test', {'counter': 0});
  });
}

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

1 回复

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


在Flutter中,sqflite 是一个非常流行的用于管理SQLite数据库的插件。然而,sqflite_darwin 并不是 sqflite 插件的一部分,而是指特定于 macOS(Darwin 是 macOS 的内核名称)的实现细节。通常,当你使用 sqflite 插件时,它会根据平台自动选择适当的实现(iOS、Android、macOS、Linux等)。

以下是一个如何在 Flutter 中使用 sqflite 插件进行数据库管理的示例代码,它会自动处理 macOS(以及其他平台)的细节,而不需要直接引用 sqflite_darwin

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 sqflite 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.2  # 请检查最新版本号

2. 导入包并创建数据库帮助类

在你的 Dart 文件中导入 sqflite 包,并创建一个帮助类来管理数据库操作:

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

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._init();
  Database? _database;

  factory DatabaseHelper() => _instance;

  DatabaseHelper._init();

  Future<Database> get database async {
    if (_database != null) return _database!;

    _database = await openDatabase(
      join(await getDatabasesPath(), 'my_database.db'),
      onCreate: (db, version) async {
        // 创建表
        await db.execute('''
          CREATE TABLE users (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            age INTEGER NOT NULL
          )
        ''');
      },
      version: 1,
    );

    return _database!;
  }

  Future<void> insertUser(String name, int age) async {
    final Database db = await database;
    await db.insert('users', {'name': name, 'age': age});
  }

  Future<List<Map<String, dynamic>>> getUsers() async {
    final Database db = await database;
    return await db.query('users');
  }
}

3. 使用数据库帮助类

在你的 Flutter 应用中使用这个帮助类来插入和检索数据:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter SQLite Demo'),
        ),
        body: FutureBuilder<List<Map<String, dynamic>>>(
          future: _loadUsers(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Center(child: Text('Error: ${snapshot.error!}'));
              } else {
                return UserList(users: snapshot.data!);
              }
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _insertDummyUser,
          tooltip: 'Add User',
          child: Icon(Icons.add),
        ),
      ),
    );
  }

  Future<void> _insertDummyUser() async {
    DatabaseHelper dbHelper = DatabaseHelper();
    await dbHelper.insertUser('John Doe', 30);
    // 重新加载用户列表
    setState(() {}); // 注意:这里的 setState 实际上应该在一个 StatefulWidget 中调用
  }

  Future<List<Map<String, dynamic>>> _loadUsers() async {
    DatabaseHelper dbHelper = DatabaseHelper();
    return dbHelper.getUsers();
  }
}

class UserList extends StatelessWidget {
  final List<Map<String, dynamic>> users;

  UserList({required this.users});

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: users.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text('${users[index]['name']} (${users[index]['age']})'),
        );
      },
    );
  }
}

注意

  1. State 管理:上面的示例中,_insertDummyUser 方法尝试调用 setState(() {});,但这实际上应该在一个 StatefulWidget 中进行。为了简单起见,这里省略了状态管理的完整实现。
  2. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,特别是在处理数据库操作时。
  3. 依赖版本:确保你使用的是 sqflite 的最新版本,可以在 pub.dev 上查看。

这个示例展示了如何在 Flutter 应用中使用 sqflite 插件进行基本的数据库操作,而无需直接引用 sqflite_darwinsqflite 插件会根据目标平台自动选择正确的实现。

回到顶部