Flutter数据库序列化插件sql_serializable的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter数据库序列化插件sql_serializable的使用

sql_serializable 是一个用于将Dart类转换为/从SQL的代码生成器和运行时库。

开始使用

首先,在你的项目中添加 sql_serializablebuild_runner 作为开发依赖,并选择一个 runtime packages 作为正常依赖:

$ dart pub add -d sql_serializable build_runner
$ dart pub add sql_serializable_postgres

然后导入运行时库并注解你想要转换为SQL的类:

import "package:sql_serializable_postgres/sql_serializable_postgres.dart";

@SqlSerializable()
class MyClass {
    // 类定义
}

接下来,将生成的文件作为部分引入,并在你的类中添加一个指向即将生成表的 static const table 字段。如果你希望方便地访问 toJsonfromJson 方法,可以添加这些方法并重定向到生成的函数:

import "package:sql_serializable_postgres/sql_serializable_postgres.dart";

part 'my_file.g.dart';

@SqlSerializable()
class MyClass {
    static const table = _$MyClassTable;

    factory MyClass.fromSql(Sql<MyClass> sql) => _$MyClassFromSql(sql);
    Sql<MyClass> toSql() => _$MyClassToSql(this);

    // 类的其他字段和方法
}

运行构建器:

$ dart run build_runner build

创建一个数据库实例来插入模型:

void main() async {
    final model = MyClass(...);  // 初始化模型
    final database = ...;  // 初始化数据库

    final id = await database.insert(model.toSql());  // 插入数据并获取ID
    final fromDatabase = MyClass.fromSql(await database.get(MyClass.table, id));  // 从数据库获取数据
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用sql_serializable插件进行数据库序列化的代码案例。sql_serializable是一个帮助开发者在Flutter应用中简化SQLite数据库操作和数据序列化的插件。虽然这个插件不是官方广泛认知的(可能是社区或特定项目中的插件),但我会基于一个类似的思路来展示如何使用Flutter和SQLite进行序列化和反序列化。

通常,Flutter开发者会使用floor库来处理SQLite数据库,并且floor支持自动生成代码来进行数据模型的序列化和反序列化。这里我们将使用floor作为示例,因为sql_serializable可能是一个特定命名或概念,而floor提供了一个相似的功能集。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  floor: ^1.0.0  # 请检查最新版本号

dev_dependencies:
  build_runner: ^2.0.0  # 用于生成代码
  floor_generator: ^1.0.0  # 请检查最新版本号,与floor版本匹配

2. 创建数据模型

创建一个数据模型,并使用@Entity注解标记它。此外,使用@floor提供的序列化注解。

import 'package:floor/floor.dart';

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

  @ColumnInfo(name: 'name')
  final String name;

  User({required this.name, this.id = 0});

  // 从数据库反序列化时调用的构造函数
  factory User.fromDatabase(Map<String, dynamic> databaseData) {
    return User(
      name: databaseData['name'] as String,
      id: databaseData['id'] as int,
    );
  }

  // 转换为Map以便序列化到数据库
  Map<String, dynamic> toMap() {
    return {
      'name': name,
    };
  }

  // 可选:重写toString以便调试
  @override
  String toString() {
    return 'User{id: $id, name: $name}';
  }
}

3. 创建DAO接口

定义一个数据访问对象(DAO)接口,用于定义数据库操作。

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

@Dao
abstract class UserDao {
  @Insert(onConflict: OnConflictStrategy.replace)
  Future<void> insertUser(User user);

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

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

4. 定义数据库

定义一个@Database注解的类来配置数据库。

import 'package:floor/floor.dart';
import 'user_dao.dart';
import 'user.dart';

@Database(version: 1, entities: [User])
abstract class AppDatabase extends FloorDatabase {
  UserDao get userDao;
}

5. 生成数据库代码

在项目根目录下运行以下命令来生成数据库访问代码:

flutter pub run build_runner build

6. 使用数据库

在你的应用中打开数据库并执行操作。

import 'package:flutter/material.dart';
import 'package:your_app/database/app_database.dart';
import 'package:your_app/models/user.dart';
import 'package:floor/floor.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final database = await $FloorAppDatabase.databaseBuilder('path_to_database.db').build();
  runApp(MyApp(database.userDao));
}

class MyApp extends StatelessWidget {
  final UserDao userDao;

  MyApp(this.userDao);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Floor Demo')),
        body: FutureBuilder<List<User>>(
          future: userDao.getAllUsers(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              final users = snapshot.data ?? [];
              return ListView.builder(
                itemCount: users.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('${users[index].name}'),
                  );
                },
              );
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            await userDao.insertUser(User(name: 'New User'));
          },
          tooltip: 'Add User',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

注意:在真实项目中,数据库路径应该使用更安全的方法来确定,比如使用getApplicationDocumentsDirectory()来获取应用文档目录。

这个例子展示了如何使用floor库来简化Flutter中的SQLite数据库操作,包括数据的序列化和反序列化。虽然sql_serializable可能是一个不同的插件,但大多数数据库序列化插件的工作原理是相似的,即通过注解和代码生成来减少手动编码的工作量。

回到顶部