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 回复