Flutter数据库管理插件fdatabase的使用

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

Flutter数据库管理插件fdatabase的使用

Getting Started(开始使用)

在你的Flutter项目中添加fdatabase插件。你可以通过以下命令将它添加到pubspec.yaml文件中:

flutter pub add fdatabase

或者直接在pubspec.yaml文件中添加依赖项:

dependencies:
  fdatabase: <any>

Usage(使用方法)

首先,你需要导入fdatabase包,并初始化数据库实例:

import 'package:fdatabase/fdatabase.dart';

void main() async {
  // 初始化数据库实例
  final db = await FDatabase.getInstance();

  // 注册Person类,使其可以保存到数据库中
  db.register<Person>(Person.new);

  // 创建一个Person对象
  final person = Person(
    id: 1,
    name: 'John',
    age: 30,
    weight: 75.5,
    married: true,
  );

  // 使用put方法保存数据
  db.put<Person>('person', person);

  db.put<String>('string', 'string');
  db.put<int>('int', 1);
  db.put<double>('double', 1.0);
  db.put<bool>('bool', true);
  db.put<DateTime>('dateTime', DateTime(2024, 4, 9));

  // 或者使用batch方法一次保存多个值
  db.batch((put) {
    put<Person>('person', person);
    put<String>('string', 'string');
    put<int>('int', 1);
    put<double>('double', 1.0);
    put<bool>('bool', true);
    put<DateTime>('dateTime', DateTime(2024, 4, 9));
  });

  // 从数据库获取数据
  db.get<Person>('person'); // 返回Person实例

  db.get<String>('string'); // 返回'string'
  db.get<int>('int'); // 返回1
  db.get<double>('double'); // 返回1.0
  db.get<bool>('bool'); // 返回true
  db.get<DateTime>('dateTime'); // 返回DateTime(2024, 4, 9)
}

Supported Data Types(支持的数据类型)

fdatabase支持以下数据类型:

  • String
  • int
  • double
  • bool
  • DateTime
  • Entity(继承自Entity的类)

所有支持的类型也支持以列表形式保存。

Under Development(开发中)

如果您有任何想法或建议,欢迎为项目贡献您的力量。


完整示例Demo

以下是完整的示例代码:

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

late FDatabase db;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  db = await FDatabase.getInstance()
    ..register<Person>(Person.new);
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Person: ${db.get<Person>('person')?.toMap()}'),
              Text('Name: ${db.get<String>('name')}'),
              Text('Age: ${db.get<int>('age')}'),
              Text('Weight: ${db.get<double>('weight')}'),
              Text('Married: ${db.get<bool>('married')}'),
              Text('Birthday: ${db.get<DateTime>('birthday')}'),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            final person = Person(
              id: 1,
              name: 'John',
              age: 30,
              weight: 75.5,
              married: true,
              birthday: DateTime(2000, 1, 1),
            );

            db.put<Person>('person', person);
            db.put<String>('name', 'John');
            db.put<int>('age', 30);
            db.put<double>('weight', 75.5);
            db.put<bool>('married', true);
            db.put<DateTime>('birthday', DateTime(2000, 1, 1));

            // 或者使用batch方法一次保存多个值
            db.batch(
              (put) {
                put<Person>('person', person);
                put<String>('name', 'John');
                put<int>('age', 30);
                put<double>('weight', 75.5);
                put<bool>('married', true);
                put<DateTime>('birthday', DateTime(2000, 1, 1));
              },
            );

            setState(() {});
          },
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}

class Person extends Entity {
  final int id;
  final String name;
  final int age;
  final double weight;
  final bool married;
  final DateTime birthday;

  const Person({
    required this.id,
    required this.name,
    required this.age,
    required this.weight,
    required this.married,
    required this.birthday,
  });

  [@override](/user/override)
  Map<Symbol, dynamic> get properties => {
        #id: id,
        #name: name,
        #age: age,
        #weight: weight,
        #married: married,
        #birthday: birthday,
      };
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter中的fdatabase(假设这是一个虚构的数据库管理插件,因为Flutter生态系统中没有一个广为人知的名为fdatabase的插件,但我们可以基于常见的数据库插件如sqflitesembast的概念进行示例)的基本示例。由于fdatabase不是实际存在的插件,我将基于Flutter中常用的SQLite数据库插件sqflite的API风格来提供一个示例。

Flutter中使用sqflite插件的示例

首先,你需要在pubspec.yaml文件中添加sqflite依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

示例代码

以下是一个简单的Flutter应用,它展示了如何使用sqflite插件来管理数据库。

1. 导入必要的包

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

2. 定义数据库帮助类

class DatabaseHelper {
  static late Database _db;

  static Future<Database> getDatabase() async {
    if (_db != null) {
      return _db;
    }
    _db = await openDatabase(
      join(await getDatabasesPath(), 'example.db'),
      onCreate: (db, version) async {
        await db.execute(
          'CREATE TABLE users('
          'id INTEGER PRIMARY KEY,'
          'name TEXT NOT NULL,'
          'age INTEGER NOT NULL'
          ')',
        );
      },
      version: 1,
    );
    return _db;
  }

  static Future<void> insertUser(User user) async {
    final db = await getDatabase();
    await db.insert(
      'users',
      user.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  static Future<List<User>> getUsers() async {
    final db = await getDatabase();
    final List<Map<String, dynamic>> maps = await db.query('users');
    return List.generate(maps.length, (i) => User.fromMap(maps[i]));
  }
}

3. 定义User类

class User {
  int? id;
  String name;
  int age;

  User({required this.name, required this.age});

  User.fromMap(Map<String, dynamic> map) {
    id = map['id'] as int?;
    name = map['name'] as String;
    age = map['age'] as int;
  }

  Map<String, dynamic> toMap() {
    return {'name': name, 'age': age};
  }
}

4. 创建UI

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Database Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<User> users = [];

  @override
  void initState() {
    super.initState();
    loadUsers();
  }

  Future<void> loadUsers() async {
    final usersList = await DatabaseHelper.getUsers();
    setState(() {
      users = usersList;
    });
  }

  Future<void> addUser() async {
    final newUser = User(name: 'John Doe', age: 30);
    await DatabaseHelper.insertUser(newUser);
    loadUsers();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Database Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            ElevatedButton(
              onPressed: addUser,
              child: Text('Add User'),
            ),
            Expanded(
              child: ListView.builder(
                itemCount: users.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('${users[index].name}, Age: ${users[index].age}'),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

总结

上面的代码示例展示了如何在Flutter应用中使用sqflite插件来管理SQLite数据库。如果你使用的是fdatabase插件(如果它真实存在的话),那么你应该参考它的官方文档来调整上述代码中的API调用。通常,数据库管理插件会提供类似的API来打开数据库、执行SQL语句、插入、查询和更新数据。

回到顶部