Flutter怎么用ORM框架管理数据库

发布时间:2023-04-17 16:20:25 作者:iii
来源:亿速云 阅读:199

Flutter怎么用ORM框架管理数据库

在Flutter应用开发中,数据库管理是一个非常重要的环节。随着应用复杂度的增加,直接使用SQL语句来操作数据库会变得繁琐且容易出错。为了简化数据库操作,ORM(Object-Relational Mapping)框架应运而生。ORM框架可以将数据库表映射为对象,使得开发者可以通过操作对象来间接操作数据库,从而提高开发效率和代码的可维护性。

本文将介绍如何在Flutter中使用ORM框架来管理数据库,重点介绍floormoor两个流行的ORM框架。

1. ORM框架简介

ORM框架的主要作用是将数据库中的表映射为编程语言中的对象,使得开发者可以通过操作对象来间接操作数据库。ORM框架通常提供以下功能:

在Flutter中,常用的ORM框架有floormoor。接下来我们将详细介绍这两个框架的使用方法。

2. 使用floor框架管理数据库

floor是一个轻量级的ORM框架,基于sqflite库,提供了简单的API来管理SQLite数据库。

2.1 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  floor: ^1.4.0

dev_dependencies:
  floor_generator: ^1.4.0
  build_runner: ^2.1.0

2.2 定义实体类

实体类对应数据库中的表。我们定义一个Person类,并使用@Entity注解标记:

import 'package:floor/floor.dart';

@Entity(tableName: 'person')
class Person {
  @PrimaryKey(autoGenerate: true)
  final int id;

  final String name;

  final int age;

  Person(this.id, this.name, this.age);
}

2.3 定义DAO接口

DAO(Data Access Object)接口用于定义数据库操作的方法。我们定义一个PersonDao接口,并使用@dao注解标记:

import 'package:floor/floor.dart';
import 'person.dart';

@dao
abstract class PersonDao {
  @Query('SELECT * FROM person')
  Future<List<Person>> findAllPersons();

  @Query('SELECT * FROM person WHERE id = :id')
  Future<Person?> findPersonById(int id);

  @insert
  Future<void> insertPerson(Person person);

  @update
  Future<void> updatePerson(Person person);

  @delete
  Future<void> deletePerson(Person person);
}

2.4 创建数据库

我们创建一个AppDatabase类来管理数据库连接,并使用@Database注解标记:

import 'package:floor/floor.dart';
import 'person_dao.dart';
import 'person.dart';

part 'app_database.g.dart'; // 生成的代码文件

@Database(version: 1, entities: [Person])
abstract class AppDatabase extends FloorDatabase {
  PersonDao get personDao;
}

2.5 生成代码

运行以下命令生成数据库和DAO的实现代码:

flutter pub run build_runner build

2.6 使用数据库

在Flutter应用中使用floor框架操作数据库的示例代码如下:

import 'package:flutter/material.dart';
import 'app_database.dart';
import 'person.dart';

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

  final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();
  final personDao = database.personDao;

  runApp(MyApp(personDao: personDao));
}

class MyApp extends StatelessWidget {
  final PersonDao personDao;

  MyApp({required this.personDao});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Floor Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  final person = Person(null, 'Alice', 30);
                  await personDao.insertPerson(person);
                },
                child: Text('Insert Person'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final persons = await personDao.findAllPersons();
                  print(persons);
                },
                child: Text('Find All Persons'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 使用moor框架管理数据库

moor是另一个流行的ORM框架,提供了更强大的功能和更灵活的API。与floor不同,moor使用Dart语言来定义数据库表和查询。

3.1 添加依赖

pubspec.yaml文件中添加moormoor_generator依赖:

dependencies:
  flutter:
    sdk: flutter
  moor: ^4.4.0
  sqlite3_flutter_libs: ^0.5.0

dev_dependencies:
  moor_generator: ^4.4.0
  build_runner: ^2.1.0

3.2 定义表结构

我们使用Dart语言定义Person表:

import 'package:moor/moor.dart';

class Persons extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  IntColumn get age => integer()();
}

3.3 定义DAO

我们定义一个PersonDao类来管理Person表的操作:

import 'package:moor/moor.dart';

part 'database.g.dart'; // 生成的代码文件

@UseMoor(tables: [Persons])
class AppDatabase extends _$AppDatabase {
  AppDatabase() : super(_openConnection());

  @override
  int get schemaVersion => 1;

  Future<List<Person>> getAllPersons() => select(persons).get();

  Future<Person?> getPersonById(int id) => (select(persons)..where((t) => t.id.equals(id))).getSingleOrNull();

  Future<void> insertPerson(Person person) => into(persons).insert(person);

  Future<void> updatePerson(Person person) => update(persons).replace(person);

  Future<void> deletePerson(Person person) => delete(persons).delete(person);
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'app_database.db'));
    return VmDatabase(file);
  });
}

3.4 生成代码

运行以下命令生成数据库和DAO的实现代码:

flutter pub run build_runner build

3.5 使用数据库

在Flutter应用中使用moor框架操作数据库的示例代码如下:

import 'package:flutter/material.dart';
import 'database.dart';

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

  final database = AppDatabase();

  runApp(MyApp(database: database));
}

class MyApp extends StatelessWidget {
  final AppDatabase database;

  MyApp({required this.database});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Moor Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  final person = PersonsCompanion.insert(name: 'Bob', age: 25);
                  await database.insertPerson(person);
                },
                child: Text('Insert Person'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final persons = await database.getAllPersons();
                  print(persons);
                },
                child: Text('Find All Persons'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 总结

在Flutter应用中使用ORM框架可以大大简化数据库操作,提高开发效率和代码的可维护性。本文介绍了floormoor两个流行的ORM框架,并提供了详细的使用示例。开发者可以根据项目需求选择合适的ORM框架来管理数据库。

无论是floor还是moor,它们都提供了强大的功能和灵活的API,能够满足大多数Flutter应用的数据库管理需求。希望本文能够帮助你在Flutter项目中更好地使用ORM框架来管理数据库。

推荐阅读:
  1. Flutter移动端怎么进行多渠道打包发布
  2. Flutter如何自定义应用程序内键盘

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

flutter orm 数据库

上一篇:NLTK安装错误怎么解决

下一篇:vue之Element-Ui输入框显示与隐藏的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》