Flutter floor数据库框架使用
集成方法
dependencies:
flutter:
sdk: flutter
floor: ^1.2.0 #数据库
dev_dependencies:
flutter_test:
sdk: flutter
floor_generator: ^1.2.0
build_runner: ^2.1.2
创建实体
@entity 标记这一个类是对应一个数据库表。
@primaryKey 用于标记这是数据表的主键
@Entity(tableName: "areas") //表名
class AreaResponseAreaList {
@primaryKey
int? id;
String? name;
String? code;
int? priceFlag;
String? pinyin;
}
创建Dao
@dao
abstract class AreaResponseAreaListDao {
@Query('SELECT * FROM areas')
Future<List<AreaResponseAreaList>> findAllPersons();
@Query('SELECT * FROM areas WHERE id = :id')
Stream<AreaResponseAreaList?> findPersonById(int id);
@insert
Future<void> insertAreas(List<AreaResponseAreaList> areaList);
}
创建数据库
文件名 AppDataBase.dart 需要与 part ‘AppDataBase.g.dart’ 中文件名保持一致,不然导致自动生成文件失败
import 'dart:async';
part 'AppDataBase.g.dart'; // the generated code will be there
@Database(version: 1, entities: [AreaResponseAreaList])
abstract class AppDataBase extends FloorDatabase {
AreaResponseAreaListDao get areaResponseAreaListDao;
}
运行以下命令 flutter packages pub run build_runner build 自动生成文件,
如果需要在文件变动时,自动重新生成使用 flutter packages pub run build_runner watch
执行命令后生成 AppDataBase.g.dart 文件
使用生成的代码
包含创建、打开数据库,及dao生成的数据库操作代码
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'AppDataBase.dart';
// **************************************************************************
// FloorGenerator
// **************************************************************************
// ignore: avoid_classes_with_only_static_members
class $FloorAppDataBase {
/// Creates a database builder for a persistent database.
/// Once a database is built, you should keep a reference to it and re-use it.
static _$AppDataBaseBuilder databaseBuilder(String name) =>
_$AppDataBaseBuilder(name);
/// Creates a database builder for an in memory database.
/// Information stored in an in memory database disappears when the process is killed.
/// Once a database is built, you should keep a reference to it and re-use it.
static _$AppDataBaseBuilder inMemoryDatabaseBuilder() =>
_$AppDataBaseBuilder(null);
}
class _$AppDataBaseBuilder {
_$AppDataBaseBuilder(this.name);
final String? name;
final List<Migration> _migrations = [];
Callback? _callback;
/// Adds migrations to the builder.
_$AppDataBaseBuilder addMigrations(List<Migration> migrations) {
_migrations.addAll(migrations);
return this;
}
/// Adds a database [Callback] to the builder.
_$AppDataBaseBuilder addCallback(Callback callback) {
_callback = callback;
return this;
}
/// Creates the database and initializes it.
Future<AppDataBase> build() async {
final path = name != null
? await sqfliteDatabaseFactory.getDatabasePath(name!)
: ':memory:';
final database = _$AppDataBase();
database.database = await database.open(
path,
_migrations,
_callback,
);
return database;
}
}
class _$AppDataBase extends AppDataBase {
_$AppDataBase([StreamController<String>? listener]) {
changeListener = listener ?? StreamController<String>.broadcast();
}
AreaResponseAreaListDao? _areaResponseAreaListDaoInstance;
Future<sqflite.Database> open(String path, List<Migration> migrations,
[Callback? callback]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
version: 1,
onConfigure: (database) async {
await database.execute('PRAGMA foreign_keys = ON');
await callback?.onConfigure?.call(database);
},
onOpen: (database) async {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await MigrationAdapter.runMigrations(
database, startVersion, endVersion, migrations);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `areas` (`id` INTEGER, `name` TEXT, `code` TEXT, `priceFlag` INTEGER, `pinyin` TEXT, PRIMARY KEY (`id`))');
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
@override
AreaResponseAreaListDao get areaResponseAreaListDao {
return _areaResponseAreaListDaoInstance ??=
_$AreaResponseAreaListDao(database, changeListener);
}
}
class _$AreaResponseAreaListDao extends AreaResponseAreaListDao {
_$AreaResponseAreaListDao(this.database, this.changeListener)
: _queryAdapter = QueryAdapter(database, changeListener),
_areaResponseAreaListInsertionAdapter = InsertionAdapter(
database,
'areas',
(AreaResponseAreaList item) => <String, Object?>{
'id': item.id,
'name': item.name,
'code': item.code,
'priceFlag': item.priceFlag,
'pinyin': item.pinyin
},
changeListener);
final sqflite.DatabaseExecutor database;
final StreamController<String> changeListener;
final QueryAdapter _queryAdapter;
final InsertionAdapter<AreaResponseAreaList>
_areaResponseAreaListInsertionAdapter;
@override
Future<List<AreaResponseAreaList>> findAllPersons() async {
return _queryAdapter.queryList('SELECT * FROM areas',
mapper: (Map<String, Object?> row) => AreaResponseAreaList());
}
@override
Stream<AreaResponseAreaList?> findPersonById(int id) {
return _queryAdapter.queryStream('SELECT * FROM areas WHERE id = ?1',
mapper: (Map<String, Object?> row) => AreaResponseAreaList(),
arguments: [id],
queryableName: 'areas',
isView: false);
}
@override
Future<void> insertAreas(List<AreaResponseAreaList> areaList) async {
await _areaResponseAreaListInsertionAdapter.insertList(
areaList, OnConflictStrategy.abort);
}
}
使用生成的 F l o o r A p p D a t a b a s e 类 , 它 允 许 访 问 数 据 库 构 建 器 。 该 名 称 由 FloorAppDatabase类,它允许访问数据库构建器。该名称由 FloorAppDatabase类,它允许访问数据库构建器。该名称由Floor和数据库类名组成
传递给databaseBuilder()的字符串将是数据库文件名。
要初始化数据库,请调用build()并使用await确保结果。
根据数据库database获取到Dao就可以操作数据库了
final String DB_NAME="Pad7_lxx";
late final AppDataBase database;
init() async {
database = await $FloorAppDataBase
.databaseBuilder(DB_NAME)
.build();
database.areaResponseAreaListDao.findPersonById(id);
}
插入更新删除操作
插入@insert
// 单个插入
@insert
Future<void> insertAreas(AreaResponseAreaList area);
//插入多个
@insert
Future<void> insertAreas(List<AreaResponseAreaList> areaList);