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

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

特性

  • 快速
  • 支持索引字段
  • 兼容Android、iOS、macOS、Web、Windows和Linux平台

开始使用

安装并使用该插件。

使用示例

示例应用位于/example文件夹中。以下是一个完整的示例代码,展示了如何使用tecfy_database插件来管理和操作数据库。

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:project/roles_page.dart';
import 'package:project/users_page.dart';
import 'package:tecfy_database/tecfy_database.dart';

void main() async {
  // 初始化数据库实例
  var db = TecfyDatabase(collections: [
    TecfyCollection('tasks', tecfyIndexFields: [
      [
        TecfyIndexField(name: "title", type: FieldTypes.text, nullable: false),
        TecfyIndexField(
          name: "desc",
          type: FieldTypes.integer,
        ),
      ],
      [TecfyIndexField(name: "isDone", type: FieldTypes.boolean, asc: false)],
      [
        TecfyIndexField(
            name: "createdAt", type: FieldTypes.datetime, asc: false)
      ],
    ]),
    TecfyCollection(
      'users',
      tecfyIndexFields: [
        [
          TecfyIndexField(name: "name", type: FieldTypes.text, nullable: false),
        ],
        [
          TecfyIndexField(
            name: "mobile",
            type: FieldTypes.integer,
          ),
        ],
        [
          TecfyIndexField(
              name: "createdAt", type: FieldTypes.datetime, asc: false)
        ],
      ],
    ),
    TecfyCollection('roles')
  ]);

  // 确保数据库已准备好
  await db.isReady();
  
  // 注册数据库实例以便在应用中全局访问
  GetIt.I.registerSingleton<TecfyDatabase>(db, instanceName: 'db');

  // 启动应用
  runApp(const MyApp());
}

// 主应用类
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Todo App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

// 主页面类
class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var db = GetIt.I.get<TecfyDatabase>(instanceName: 'db');
  final TextEditingController _titleFieldController = TextEditingController();
  final TextEditingController _descFieldController = TextEditingController();

  // 显示对话框以添加或更新任务
  Future<void> _displayDialog(value) async {
    if (value != null) {
      _titleFieldController.text = value['title'];
      _descFieldController.text = value['desc'];
    }
    var result = await showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text('Add a task to your list'),
            content: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 5),
                  child: TextField(
                    controller: _titleFieldController,
                    decoration: const InputDecoration(hintText: 'title'),
                  ),
                ),
                TextField(
                  controller: _descFieldController,
                  decoration: const InputDecoration(hintText: 'desc'),
                ),
              ],
            ),
            actions: <Widget>[
              TextButton(
                child: Text(value != null ? "Update" : 'ADD'),
                onPressed: value != null
                    ? () async {
                        await db
                            .collection('tasks')
                            .doc(value['id'])
                            .update(data: {
                          "title": _titleFieldController.text,
                          "desc": _descFieldController.text,
                          // "isDone": true,
                          // "createdAt": value['createdAt']
                        }, notifier: true);
                        Navigator.of(context).pop();
                      }
                    : () async {
                        var insertResult =
                            await db.collection('tasks').add(data: {
                          "title": _titleFieldController.text,
                          "desc": _descFieldController.text,
                          "isDone": false,
                          "createdAt": DateTime.now()
                        });

                        Navigator.of(context).pop();
                      },
              ),
              TextButton(
                child: const Text('CANCEL'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ],
          );
        });

    if (result != null) {}
  }

  // 构建应用主界面
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: Drawer(
        child: ListView(
          children: [
            DrawerHeader(
              child: Text(
                'Options',
                style: TextStyle(color: Colors.white),
              ),
              decoration: BoxDecoration(color: Theme.of(context).primaryColor),
            ),
            ListTile(
              leading: Icon(Icons.person),
              title: Text('Users'),
              onTap: () {
                Navigator.push(
                    context, MaterialPageRoute(builder: (_) => UsersPage()));
              },
            ),
            ListTile(
              leading: Icon(Icons.settings),
              title: Text('Roles'),
              onTap: () {
                Navigator.push(
                    context, MaterialPageRoute(builder: (_) => RolesPage()));
              },
            ),
            ListTile(
              leading: Icon(Icons.delete),
              title: Text('Delete db'),
              onTap: () async {
                var db = GetIt.I.get<TecfyDatabase>(instanceName: 'db');
                await db.collection('roles').clear();
              },
            ),
          ],
        ),
      ),
      appBar: AppBar(
        title: const Text('Todo App'),
      ),
      body: Row(
        children: [
          Expanded(
            child: StreamBuilder(
                stream: db.collection('tasks').stream(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }
                  if (snapshot.data?.isEmpty ?? false) {
                    return Center(
                      child: Text(
                        "No Data found",
                      ),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data?.length,
                        itemBuilder: (context, index) =>
                            ListTile(
                              onTap: () => onUpdateClicekd(snapshot.data?[index]),
                              trailing: traillingWidget(snapshot.data?[index]),
                              leading: Text(snapshot.data?[index]['title']),
                            ));
                  }
                }),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => _displayDialog(null),
        tooltip: 'add new todo',
        child: const Icon(Icons.add),
      ),
    );
  }

  // 当任务被点击时调用此方法
  void onUpdateClicekd(value) {
    _displayDialog(value);
  }

  // 构建任务删除按钮
  Widget traillingWidget(value) {
    return IconButton(
        onPressed: () async {
          var result = await db
              .collection('tasks')
              .doc(value['id'].toString())
              .delete(notifier: true);
        },
        icon: Icon(Icons.delete));
  }
}

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

1 回复

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


tecfy_database 是一个用于 Flutter 的数据库管理插件,它提供了一种简单而灵活的方式来管理本地数据库。这个插件通常用于需要本地数据存储和管理的应用程序中,例如存储用户设置、缓存数据等。以下是使用 tecfy_database 的基本步骤和示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  tecfy_database: ^1.0.0  # 请使用最新版本

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

2. 初始化数据库

在使用 tecfy_database 之前,你需要初始化数据库。通常,你可以在 main.dart 文件中完成这个操作:

import 'package:tecfy_database/tecfy_database.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化数据库
  await TecfyDatabase.initDatabase('my_database.db');
  
  runApp(MyApp());
}

3. 创建表

在数据库中创建表,你可以使用 createTable 方法:

await TecfyDatabase.createTable('users', {
  'id': 'INTEGER PRIMARY KEY',
  'name': 'TEXT',
  'email': 'TEXT',
  'age': 'INTEGER',
});

4. 插入数据

使用 insert 方法向表中插入数据:

await TecfyDatabase.insert('users', {
  'name': 'John Doe',
  'email': 'john.doe@example.com',
  'age': 30,
});

5. 查询数据

使用 query 方法从表中查询数据:

List<Map<String, dynamic>> users = await TecfyDatabase.query('users');
for (var user in users) {
  print('User: ${user['name']}, Email: ${user['email']}, Age: ${user['age']}');
}

你可以添加条件来过滤查询结果:

List<Map<String, dynamic>> users = await TecfyDatabase.query('users', where: 'age > ?', whereArgs: [25]);

6. 更新数据

使用 update 方法更新表中的数据:

await TecfyDatabase.update('users', {
  'age': 31,
}, where: 'id = ?', whereArgs: [1]);

7. 删除数据

使用 delete 方法从表中删除数据:

await TecfyDatabase.delete('users', where: 'id = ?', whereArgs: [1]);

8. 删除表

如果你想删除一个表,可以使用 dropTable 方法:

await TecfyDatabase.dropTable('users');

9. 关闭数据库

在应用程序生命周期结束时,或者当你不再需要数据库连接时,可以关闭数据库:

await TecfyDatabase.closeDatabase();

示例应用

以下是一个简单的示例应用,演示了如何使用 tecfy_database 进行 CRUD 操作:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await TecfyDatabase.initDatabase('my_database.db');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Tecfy Database Example')),
        body: DatabaseExample(),
      ),
    );
  }
}

class DatabaseExample extends StatefulWidget {
  [@override](/user/override)
  _DatabaseExampleState createState() => _DatabaseExampleState();
}

class _DatabaseExampleState extends State<DatabaseExample> {
  [@override](/user/override)
  void initState() {
    super.initState();
    _initDatabase();
  }

  Future<void> _initDatabase() async {
    await TecfyDatabase.createTable('users', {
      'id': 'INTEGER PRIMARY KEY',
      'name': 'TEXT',
      'email': 'TEXT',
      'age': 'INTEGER',
    });
  }

  Future<void> _addUser() async {
    await TecfyDatabase.insert('users', {
      'name': 'Jane Doe',
      'email': 'jane.doe@example.com',
      'age': 28,
    });
    setState(() {});
  }

  Future<void> _fetchUsers() async {
    List<Map<String, dynamic>> users = await TecfyDatabase.query('users');
    for (var user in users) {
      print('User: ${user['name']}, Email: ${user['email']}, Age: ${user['age']}');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: _addUser,
            child: Text('Add User'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _fetchUsers,
            child: Text('Fetch Users'),
          ),
        ],
      ),
    );
  }
}
回到顶部