Flutter本地数据库管理插件sqlitec的使用

Flutter本地数据库管理插件sqlitec的使用

简介

A Dart插件用于生成本地数据库的样板代码,具有低耦合性和类型安全性,完全受到Go语言库sqlc的启发。

这不是一个ORM。 这个包并没有意图成为一个ORM。相反,它只是为你处理数据库的繁琐部分,让你保持控制并完全了解发生了什么。没有魔法代码,没有意外,只有简单且惯用的Dart代码。

此插件可以在任何操作系统上工作,并且可以与sqflitesqflite_common_ffi一起使用。


特性

使用此插件在您的Dart应用程序中实现以下功能:

  • 从表中创建类。
  • 调用查询作为简单的Dart方法以确保类型安全。
  • 在不担心类型转换和所有样板代码的情况下从数据库中消费数据。

开始使用

要使用此插件,您需要安装sqflitesqflite_common_ffi实现。


使用方法

在项目的lib文件夹中创建一个.sql文件,并编写自定义SQL命令。

示例SQL文件 (example.sql)

create table customers (
    id integer primary key autoincrement,
    name varchar not null default null,
    status varchar not null default ''
);

--name getCustomerByName :one
select * from customers where name = ? and status = :status;

--name: insertCustomer :exec
insert into customers(name, status) values (?, ?);

自动生成代码

运行插件后,会生成对应的Dart代码。以下是生成的代码示例:

生成的代码 (sqlitec/schemas.dart)

class Customers {
  static const String $tableInfo = 'customers';
  static const String $createTableStatement = 'CREATE TABLE customers(id integer PRIMARY KEY AUTOINCREMENT, name varchar NOT NULL DEFAULT NULL, status varchar NOT NULL DEFAULT \'\')';
  
  int id;
  String name;
  String status;

  Customers({
    required this.id,
    required this.name,
    required this.status,
  });

  factory Customers.fromJson(Map<String, dynamic> jsonMap) {
    return Customers(
      id: (jsonMap['id'] as num).toInt(),
      name: jsonMap['name'] as String,
      status: jsonMap['status'] as String,
    );
  }

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

  @override
  String toString() {
    return '''Customers(
  id: $id,
  name: $name,
  status: $status,
)''';
  }
}

// 方法生成在Queries类中 (`sqlitec/queries.sqlitec.dart`)
Future<Customers?> getCustomerByNameAndStatus(String $arg1, {required String status}) async {
  final result = await db.rawQuery(
    'SELECT * FROM customers WHERE name = ? AND status = ?',
    [$arg1, status],
  );

  if (result.isEmpty) return null;
  final resultFirst = result.first;
  return Customers.fromJson(resultFirst);
}

Future<int> insertCustomer({required String name, required String status}) async {
  final result = await db.rawInsert(
    'INSERT INTO customers (name, status) VALUES (?, ?)',
    [name, status],
  );

  return result;
}

使用生成的代码

final queries = Queries(db: /*您的数据库实例*/);

await queries.insertCustomer(name: 'Bob', status: 'registered');
final user = await queries.getCustomerByNameAndStatus('Bob', status: 'registered');

print(user); 
// 输出: Customers(id: 1, name: Bob, status: registered)

示例代码

以下是完整的示例代码,展示如何初始化数据库并使用生成的代码:

示例代码 (example/lib/example.dart)

import 'dart:convert';

import 'package:example/sqlitec/queries.sqlitec.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

import 'sqlitec/schemas.sqlitec.dart';

Future<void> main(List<String> arguments) async {
  // 初始化sqflite ffi
  sqfliteFfiInit();
  
  // 打开内存数据库
  final db = await databaseFactoryFfi.openDatabase(
    inMemoryDatabasePath,
    options: OpenDatabaseOptions(
      onConfigure: (db) async {
        // 创建表
        await db.execute(Orders.$createTableStatement);
        await db.execute(Customers.$createTableStatement);
        await db.execute(Payments.$createTableStatement);
      },
    ),
  );

  // 初始化Queries实例
  final queries = Queries(db: db);

  // 插入数据
  var id = await queries.insertCustumer(name: 'Kauli', status: 'registered');
  print(id);

  // 更新数据
  await db.update('customers', {'updated_at': 'asdfasdfasdf'});

  // 查询数据
  final asdf = await db.query('customers', where: 'name = ?', whereArgs: ['Kauli']);
  print(jsonEncode(asdf));

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

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

1 回复

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


在Flutter中,sqflite 是一个常用的插件,用于管理和操作SQLite数据库。以下是如何使用 sqflite 插件进行本地数据库管理的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sqflitepath 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path: ^1.8.0

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

2. 创建数据库

创建一个类来管理数据库操作。你可以在这个类中定义数据库的创建、表的创建、以及各种CRUD操作。

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  factory DatabaseHelper() => _instance;
  static Database? _database;

  DatabaseHelper._internal();

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

  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'my_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE users(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
      )
    ''');
  }
}

3. 插入数据

定义插入数据的方法:

Future<void> insertUser(Map<String, dynamic> user) async {
  final db = await DatabaseHelper().database;
  await db.insert('users', user, conflictAlgorithm: ConflictAlgorithm.replace);
}

4. 查询数据

定义查询数据的方法:

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

5. 更新数据

定义更新数据的方法:

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

6. 删除数据

定义删除数据的方法:

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

7. 使用数据库操作

在你的应用程序中,你可以使用这些方法来管理数据库。例如:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 插入数据
  await insertUser({'name': 'John Doe', 'age': 30});

  // 查询数据
  List<Map<String, dynamic>> users = await getUsers();
  print(users);

  // 更新数据
  await updateUser({'id': 1, 'name': 'John Doe', 'age': 31});

  // 删除数据
  await deleteUser(1);

  runApp(MyApp());
}

8. 关闭数据库

在应用程序结束时,关闭数据库:

Future<void> closeDatabase() async {
  final db = await DatabaseHelper().database;
  await db.close();
}
回到顶部