Flutter数据库注解管理插件flutter_annotation_sqlite的使用

Flutter数据库注解管理插件flutter_annotation_sqlite的使用

flutter_annotation_sqlite 是一个基于注解的 SQLite 库。本文将详细介绍如何使用该库来管理数据库。

示例

实体类

首先定义实体类 Person,并使用注解来描述其字段。

import 'package:flutter_annotation_sqlite/flutter_annotation_sqlite.dart';

@Entity(/*table: 'tb_person'*/)
class Person {
  @Id()
  final int id;

  @Column(unique: true)
  final String name;
  
  @Column()
  final int age;
  
  @Column()
  final double height;

  @Column(name: 'is_vip', indexable: true)
  final bool isVip;

  @Column()
  final Address? address;

  @Column()
  final DateTime? birthday;
}

数据库仓库

定义一个仓库类 PersonRepository 来进行数据库操作。

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

@Repository(Person)
abstract class PersonRepository {
  static PersonRepository create(Database database) => _$PersonRepository(database);

  @Query()
  Future<List<Person>> findEntities(int page, {String? likeName, int limit = 20});

  @Query()
  Future<Person?> findById(int id);

  @Query()
  Future<Map> findMapByName(String name);

  @Query(fields: ['name', 'isVip'])
  Future<Map> findValueById(int id);

  @Query(fields: ['age'])
  Future<int> findAgeByName(String name);

  @Query(fields: ['birthday'])
  Future<DateTime> findBirthdayByName(String name);

  @Query(fields: ['name'], orderBy: [{'age': OrderingTerm.desc}, {'height': OrderingTerm.asc}])
  Future<List<String>> findNames(bool isVip, {double? orGteHeight});

  @Query(fields: ['birthday'])
  Future<List<DateTime>> findBirthdays(bool isVip);

  @Query(fields: ['id', 'name', 'age', 'height', 'isVip', 'address', 'birthday'])
  Future<List<Map<String, dynamic>>> findValues([String? likeName]);

  @Insert(sqflite.ConflictAlgorithm.abort)
  Future<void> insert(Person entity);

  @Update()
  Future<void> updateById(Person entity, int id);

  @Update(conflict: sqflite.ConflictAlgorithm.replace, ignoreNull: true)
  Future<void> updateAll(Person entity);

  @Delete()
  Future<void> delete(int id);

  @Delete()
  Future<bool> deleteByAge(int age, {double? orHeight});
}

数据库定义

定义数据库类 AppDatabase 并指定实体类和版本号。

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

@Database(version: 1, entities: [Person, Address], migrations: [V2Migrator])
abstract class AppDatabase {
  Database get database;

  Future<void> open(String dbPath, {bool inMemory = false});

  Future<void> close();

  DatabaseFactory get sqliteFactory {
    if (kReleaseMode) {
      return sqflite.databaseFactorySqflitePlugin;
    }
    // 打印SQL语句
    return sqlLoggerFactory(sqflite.databaseFactorySqflitePlugin);
  }

  static AppDatabase create() => _$AppDatabase();
}

数据库迁移

定义一个迁移类 V2Migrator 用于数据库版本升级。

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

class V2Migrator extends Migrator {
  [@override](/user/override)
  FutureOr<void> onMigration(Database db) {
    // 迁移逻辑
    throw UnimplementedError();
  }

  [@override](/user/override)
  int get fromVersion => 1;

  [@override](/user/override)
  int get toVersion => 2;
}

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

1 回复

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


flutter_annotation_sqlite 是一个用于在 Flutter 应用中通过注解方式管理 SQLite 数据库的插件。它允许开发者通过注解来定义数据库表、字段、关系等,从而简化数据库操作。以下是如何使用 flutter_annotation_sqlite 的基本步骤:

1. 添加依赖

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

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

然后运行 flutter pub get 来获取依赖。

2. 定义实体类

使用注解来定义数据库表及其字段。例如,定义一个 User 实体类:

import 'package:flutter_annotation_sqlite/flutter_annotation_sqlite.dart';

@Entity(tableName: 'users')
class User {
  @PrimaryKey(autoGenerate: true)
  int? id;

  @ColumnInfo(name: 'user_name')
  String? userName;

  @ColumnInfo(name: 'email')
  String? email;

  User({this.id, this.userName, this.email});
}
  • @Entity(tableName: 'users'):指定该类对应的数据库表名为 users
  • @PrimaryKey(autoGenerate: true):指定 id 为主键,并且自动生成。
  • @ColumnInfo(name: 'user_name'):指定 userName 字段对应的数据库列名为 user_name

3. 创建数据库帮助类

创建一个数据库帮助类来管理数据库的创建和操作:

import 'package:flutter_annotation_sqlite/flutter_annotation_sqlite.dart';
import 'user.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  late AppDatabase _database;

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

  Future<void> init() async {
    _database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();
  }

  AppDatabase get database => _database;
}

4. 初始化数据库

在你的应用启动时初始化数据库:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DatabaseHelper().init();
  runApp(MyApp());
}

5. 使用数据库

在你的应用中使用数据库进行增删改查操作。例如,插入一个用户:

void insertUser() async {
  final database = DatabaseHelper().database;
  final userDao = database.userDao;

  final user = User(userName: 'JohnDoe', email: 'john.doe@example.com');
  await userDao.insertUser(user);
}

6. 定义 DAO 接口

定义数据访问对象 (DAO) 接口来进行数据库操作:

@dao
abstract class UserDao {
  @insert
  Future<void> insertUser(User user);

  @Query('SELECT * FROM users')
  Future<List<User>> getAllUsers();

  @Query('SELECT * FROM users WHERE id = :id')
  Future<User?> getUserById(int id);

  @update
  Future<void> updateUser(User user);

  @delete
  Future<void> deleteUser(User user);
}

7. 运行代码生成

flutter_annotation_sqlite 使用了代码生成来生成数据库相关的代码。运行以下命令来生成代码:

flutter pub run build_runner build

8. 使用生成的代码

生成的代码会包含数据库的构建器、DAO 实现等。你可以在应用中使用这些生成的代码来操作数据库。

9. 示例:查询所有用户

以下是一个查询所有用户的示例:

void getAllUsers() async {
  final database = DatabaseHelper().database;
  final userDao = database.userDao;

  final users = await userDao.getAllUsers();
  users.forEach((user) {
    print('User: ${user.userName}, Email: ${user.email}');
  });
}
回到顶部