Flutter SQLite抽象层插件brick_sqlite_abstract的使用

Flutter SQLite抽象层插件brick_sqlite_abstract的使用

brick_sqlite_abstract workflow

Brick SQLite Abstract #

SQLite提供程序添加类级和字段级配置。

常见问题 #

为什么这个包不包含在brick_sqlite中?#

brick_build 使用 dart:mirrors 来确定字段类型和类结构。Flutter不能使用 dart:mirrors。而 brick_sqlite 依赖于Flutter。因此,为了在生成的代码中使用SQLite注解(注解提供了序列化和反序列化的信息),这个包必须分离,以便 brick_build 不会导入 brick_sqlite

使用方法 #

要使用 brick_sqlite_abstract 插件,你需要遵循以下步骤:

步骤1:将依赖项添加到你的项目中 #

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

dependencies:
  brick_sqlite_abstract: ^0.1.0

步骤2:创建你的模型类 #

接下来,创建一个模型类,并使用注解来定义字段及其属性。

import 'package:brick_sqlite_abstract/brick_sqlite_abstract.dart';

class User extends SqlEntity {
  @SqlSerializable()
  final String name;

  @SqlSerializable()
  final int age;

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

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

步骤3:创建数据库帮助类 #

然后,创建一个帮助类来管理数据库操作。

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'user.dart'; // 导入你的模型类

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

  DatabaseHelper._instance();

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

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

  void _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE user (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER NOT NULL
      )
    ''');
  }

  Future<List<User>> getUsers() async {
    Database db = await instance.database;
    List<Map<String, dynamic>> maps = await db.query('user');
    return List.generate(maps.length, (i) {
      return User(
        name: maps[i]['name'],
        age: maps[i]['age'],
      );
    });
  }
}

步骤4:执行数据库操作 #

现在你可以使用数据库帮助类来进行各种数据库操作,例如插入数据、查询数据等。

Future<void> insertUser(User user) async {
  final Database db = await DatabaseHelper.instance.database;
  await db.insert(
    'user',
    user.toJson(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

Future<List<User>> fetchUsers() async {
  final Database db = await DatabaseHelper.instance.database;
  List<Map<String, dynamic>> maps = await db.query('user');
  return List.generate(maps.length, (i) {
    return User(
      name: maps[i]['name'],
      age: maps[i]['age'],
    );
  });
}

更多关于Flutter SQLite抽象层插件brick_sqlite_abstract的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SQLite抽象层插件brick_sqlite_abstract的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


brick_sqlite_abstract 是一个用于 Flutter 的 SQLite 抽象层插件,它帮助开发者更方便地在 Flutter 应用中与 SQLite 数据库进行交互。通过使用这个插件,开发者可以避免直接编写 SQL 语句,而是通过更高级的抽象来操作数据库。

安装

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

dependencies:
  flutter:
    sdk: flutter
  brick_sqlite_abstract: ^0.1.0

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

基本使用

1. 定义模型

首先,你需要定义一个数据模型类,并使用 SqliteModel 注解来标记它:

import 'package:brick_sqlite_abstract/annotations.dart';
import 'package:brick_sqlite_abstract/sqlite_model.dart';

@SqliteModel()
class User extends SqliteModel {
  final String name;
  final int age;

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

2. 生成代码

使用 build_runner 来生成必要的代码。在你的项目根目录下运行以下命令:

flutter pub run build_runner build

这将生成一个 UserAdapter 类,用于在数据库和模型之间进行转换。

3. 初始化数据库

接下来,你需要初始化 SQLite 数据库并注册你的模型:

import 'package:brick_sqlite_abstract/sqlite_provider.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';

Future<SqliteProvider> initializeDatabase() async {
  final directory = await getApplicationDocumentsDirectory();
  final path = p.join(directory.path, 'my_database.db');
  final provider = SqliteProvider(path);

  // 注册模型
  provider.registerAdapter(UserAdapter());

  await provider.initialize();
  return provider;
}

4. 操作数据库

现在你可以使用 SqliteProvider 来执行数据库操作:

void main() async {
  final provider = await initializeDatabase();

  // 插入数据
  final user = User(name: 'John Doe', age: 30);
  await provider.upsert<User>(user);

  // 查询数据
  final users = await provider.get<User>();
  print(users); // 输出: [User(name: John Doe, age: 30)]

  // 更新数据
  user.age = 31;
  await provider.upsert<User>(user);

  // 删除数据
  await provider.delete<User>(user);
}

高级用法

1. 关系模型

你可以定义关系模型,例如一对多或多对多关系。通过在模型中使用 @Sqlite 注解来定义关系:

@SqliteModel()
class Post extends SqliteModel {
  final String title;
  final String content;
  final User author;

  Post({required this.title, required this.content, required this.author});
}

2. 自定义查询

你可以使用 SqliteProviderquery 方法来执行自定义查询:

final users = await provider.query<User>(where: 'age > ?', whereArgs: [25]);
回到顶部