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

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

本文将详细介绍如何使用Flutter的sqflite_common插件。请注意,此插件通常不建议直接使用,而是作为其他插件(如sqflite)的基础依赖。

简介

sqflite_common 是一个用于数据库操作的通用库,主要用于支持Flutter的跨平台数据库功能。它为桌面端和单元测试提供了额外的支持。

使用场景

  • 移动设备:推荐使用 sqflite 插件。
  • 桌面端:推荐使用 sqflite_common_ffi 插件。
  • 单元测试:同样可以结合 sqflite_common 进行测试。

示例代码

以下是一个简单的示例,展示如何使用 sqflite_common 插件进行基本的数据库操作。

import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqflite/sqflite.dart';

Future<void> main() async {
  // 初始化 sqflite_common 的 ffi 支持(仅在桌面端使用)
  sqfliteFfiInit();

  // 打开数据库
  final databasePath = await getDatabasesPath();
  final db = await openDatabase(
    '$databasePath/test.db',
    version: 1,
    onCreate: (db, version) async {
      // 创建表
      await db.execute('''
        CREATE TABLE test (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT NOT NULL,
          age INTEGER
        )
      ''');
    },
  );

  // 插入数据
  await db.insert('test', {'name': 'Alice', 'age': 25});
  await db.insert('test', {'name': 'Bob', 'age': 30});

  // 查询数据
  List<Map<String, dynamic>> result = await db.query('test');
  print(result);

  // 更新数据
  await db.update('test', {'age': 26}, where: 'name = ?', whereArgs: ['Alice']);

  // 删除数据
  await db.delete('test', where: 'name = ?', whereArgs: ['Bob']);

  // 关闭数据库
  await db.close();
}

代码说明

  1. 初始化 sqflite_common 的 ffi 支持

    sqfliteFfiInit();
    

    此方法仅在桌面端使用,用于初始化 SQLite 的本地支持。

  2. 打开数据库

    final databasePath = await getDatabasesPath();
    final db = await openDatabase(
      '$databasePath/test.db',
      version: 1,
      onCreate: (db, version) async {
        await db.execute(...);
      },
    );
    
    • getDatabasesPath():获取数据库存储路径。
    • openDatabase():打开或创建数据库文件。
    • onCreate:数据库首次创建时执行的操作。
  3. 插入数据

    await db.insert('test', {'name': 'Alice', 'age': 25});
    

    使用 insert 方法向表中插入数据。

  4. 查询数据

    List<Map<String, dynamic>> result = await db.query('test');
    print(result);
    

    查询表中的所有数据并打印结果。

  5. 更新数据

    await db.update('test', {'age': 26}, where: 'name = ?', whereArgs: ['Alice']);
    

    更新指定条件的数据。

  6. 删除数据

    await db.delete('test', where: 'name = ?', whereArgs: ['Bob']);
    

    删除满足条件的数据。

  7. 关闭数据库

    await db.close();
    

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

1 回复

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


octodb_sqflite_common 是一个用于 Flutter 的数据库管理插件,它基于 sqflite 库,提供了更高级的抽象和功能,使得在 Flutter 应用中管理 SQLite 数据库变得更加简单和高效。以下是如何使用 octodb_sqflite_common 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 octodb_sqflite_common 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  octodb_sqflite_common: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化数据库

在使用 octodb_sqflite_common 之前,你需要初始化数据库。通常,你可以在应用的 main 函数中完成这个操作。

import 'package:octodb_sqflite_common/octodb_sqflite_common.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化数据库
  await OctoDB.initialize(
    databaseName: 'my_database.db',
    version: 1,
    onCreate: (db, version) async {
      // 创建表
      await db.execute('''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT,
          age INTEGER
        )
      ''');
    },
    onUpgrade: (db, oldVersion, newVersion) async {
      // 数据库升级逻辑
    },
  );

  runApp(MyApp());
}

3. 使用数据库

初始化数据库后,你可以使用 OctoDB 类来执行各种数据库操作。

插入数据

Future<void> insertUser(User user) async {
  final db = await OctoDB.database;
  await db.insert(
    'users',
    user.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

查询数据

Future<List<User>> getUsers() async {
  final db = await OctoDB.database;
  final List<Map<String, dynamic>> maps = await db.query('users');

  return List.generate(maps.length, (i) {
    return User.fromMap(maps[i]);
  });
}

更新数据

Future<void> updateUser(User user) async {
  final db = await OctoDB.database;
  await db.update(
    'users',
    user.toMap(),
    where: 'id = ?',
    whereArgs: [user.id],
  );
}

删除数据

Future<void> deleteUser(int id) async {
  final db = await OctoDB.database;
  await db.delete(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );
}

4. 关闭数据库

在应用退出时,你可以选择关闭数据库以释放资源。

Future<void> closeDatabase() async {
  final db = await OctoDB.database;
  await db.close();
}

5. 示例模型类

以下是一个简单的 User 模型类,用于映射数据库中的 users 表。

class User {
  int id;
  String name;
  int age;

  User({this.id, this.name, this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

6. 完整示例

以下是一个完整的示例,展示了如何使用 octodb_sqflite_common 插件进行数据库操作。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await OctoDB.initialize(
    databaseName: 'my_database.db',
    version: 1,
    onCreate: (db, version) async {
      await db.execute('''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT,
          age INTEGER
        )
      ''');
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<User> users = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadUsers();
  }

  Future<void> _loadUsers() async {
    final List<User> userList = await getUsers();
    setState(() {
      users = userList;
    });
  }

  Future<void> _addUser() async {
    final user = User(name: 'John Doe', age: 30);
    await insertUser(user);
    _loadUsers();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OctoDB Example'),
      ),
      body: ListView.builder(
        itemCount: users.length,
        itemBuilder: (context, index) {
          final user = users[index];
          return ListTile(
            title: Text(user.name),
            subtitle: Text('Age: ${user.age}'),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addUser,
        child: Icon(Icons.add),
      ),
    );
  }
}

class User {
  int id;
  String name;
  int age;

  User({this.id, this.name, this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

Future<void> insertUser(User user) async {
  final db = await OctoDB.database;
  await db.insert(
    'users',
    user.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

Future<List<User>> getUsers() async {
  final db = await OctoDB.database;
  final List<Map<String, dynamic>> maps = await db.query('users');

  return List.generate(maps.length, (i) {
    return User.fromMap(maps[i]);
  });
}
回到顶部