Flutter数据库基础设施插件db_infra的使用

Flutter数据库基础设施插件db_infra的使用

在本示例中,我们将展示如何使用db_infra插件来处理数据库操作。我们将创建一个简单的Flutter应用,该应用能够连接到SQLite数据库并执行基本的CRUD(创建、读取、更新、删除)操作。

示例代码

首先,确保你已经添加了db_infra依赖到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  db_infra: ^1.0.0

然后,运行flutter pub get以安装依赖项。

接下来,我们来看一下完整的示例代码。

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:db_infra/db_infra.dart'; // 导入db_infra库

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

///
class MyApp extends StatelessWidget {
  ///
  const MyApp({Key? key}) : super(key: key);

  // 这个小部件是你的应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你应用的主题。
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

///
class MyHomePage extends StatefulWidget {
  ///
  const MyHomePage({required this.title, Key? key}) : super(key: key);

  // 这个小部件是你的应用的主页面。它是一个有状态的小部件,意味着它有一个包含影响其外观字段的状态对象。
  // 这个类是状态的配置。它持有由父级(在这个例子中是App小部件)提供的值(在这个例子中是标题),并用于构建方法的状态构建。
  // 小部件子类中的字段总是标记为“final”。

  ///
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  DatabaseHelper dbHelper = DatabaseHelper(); // 创建DatabaseHelper实例

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('你按下了按钮次数:'),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
              onPressed: () async {
                await dbHelper.insertData('test', {'name': 'John Doe'});
                print('数据插入成功');
              },
              child: Text('插入数据'),
            ),
            ElevatedButton(
              onPressed: () async {
                var data = await dbHelper.getData('test');
                print('查询结果: $data');
              },
              child: Text('查询数据'),
            ),
            ElevatedButton(
              onPressed: () async {
                await dbHelper.updateData('test', 1, {'name': 'Jane Doe'});
                print('数据更新成功');
              },
              child: Text('更新数据'),
            ),
            ElevatedButton(
              onPressed: () async {
                await dbHelper.deleteData('test', 1);
                print('数据删除成功');
              },
              child: Text('删除数据'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

数据库帮助类 DatabaseHelper

为了简化数据库操作,我们可以创建一个帮助类DatabaseHelper来封装所有的数据库操作逻辑。

import 'package:db_infra/db_infra.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  factory DatabaseHelper() => _instance;
  DatabaseHelper._internal();

  Database? _database;

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await initializeDatabase();
    return _database!;
  }

  Future<Database> initializeDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'app_database.db');
    return await openDatabase(path, version: 1, onCreate: _onCreate);
  }

  void _onCreate(Database db, int version) async {
    await db.execute("CREATE TABLE test(id INTEGER PRIMARY KEY, name TEXT)");
  }

  Future<void> insertData(String tableName, Map<String, dynamic> row) async {
    final db = await database;
    await db.insert(tableName, row);
  }

  Future<List<Map<String, dynamic>>> getData(String tableName) async {
    final db = await database;
    return await db.query(tableName);
  }

  Future<int> updateData(String tableName, int id, Map<String, dynamic> row) async {
    final db = await database;
    return await db.update(tableName, row, where: 'id = ?', whereArgs: [id]);
  }

  Future<int> deleteData(String tableName, int id) async {
    final db = await database;
    return await db.delete(tableName, where: 'id = ?', whereArgs: [id]);
  }
}

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

1 回复

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


db_infra 是一个用于 Flutter 的数据库基础设施插件,旨在简化本地数据库的管理和操作。它提供了一种简单的方式来处理 SQLite 数据库,并且支持多种数据库操作,如查询、插入、更新和删除等。

以下是如何使用 db_infra 插件的基本步骤:

1. 添加依赖

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

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

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

2. 初始化数据库

在你的 Flutter 应用中,你需要初始化数据库。通常,你可以在 main.dart 文件中进行初始化:

import 'package:db_infra/db_infra.dart';

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

3. 创建数据模型

db_infra 使用数据模型来映射数据库表。你需要创建一个类来表示你的数据模型,并继承 DbModel

import 'package:db_infra/db_infra.dart';

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

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

  [@override](/user/override)
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  [@override](/user/override)
  User fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

4. 创建数据库表

在使用数据模型之前,你需要创建对应的数据库表。你可以在应用的启动时执行此操作:

void createTable() async {
  await DbInfra.createTable(User());
}

5. 插入数据

你可以使用 insert 方法将数据插入到数据库中:

void insertUser() async {
  User user = User(name: 'John Doe', age: 30);
  await DbInfra.insert(user);
}

6. 查询数据

你可以使用 query 方法来查询数据:

void queryUsers() async {
  List<User> users = await DbInfra.query(User());
  users.forEach((user) {
    print('ID: ${user.id}, Name: ${user.name}, Age: ${user.age}');
  });
}

7. 更新数据

你可以使用 update 方法来更新数据:

void updateUser() async {
  User user = User(id: 1, name: 'Jane Doe', age: 25);
  await DbInfra.update(user);
}

8. 删除数据

你可以使用 delete 方法来删除数据:

void deleteUser() async {
  User user = User(id: 1);
  await DbInfra.delete(user);
}

9. 关闭数据库

在应用退出时,你可以关闭数据库连接:

void closeDatabase() async {
  await DbInfra.close();
}

10. 使用示例

以下是一个完整的示例,展示了如何使用 db_infra

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DbInfra.initialize(dbName: 'my_database.db');
  
  // 创建表
  await DbInfra.createTable(User());
  
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('db_infra Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: insertUser,
                child: Text('Insert User'),
              ),
              ElevatedButton(
                onPressed: queryUsers,
                child: Text('Query Users'),
              ),
              ElevatedButton(
                onPressed: updateUser,
                child: Text('Update User'),
              ),
              ElevatedButton(
                onPressed: deleteUser,
                child: Text('Delete User'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

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

  [@override](/user/override)
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  [@override](/user/override)
  User fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

void insertUser() async {
  User user = User(name: 'John Doe', age: 30);
  await DbInfra.insert(user);
}

void queryUsers() async {
  List<User> users = await DbInfra.query(User());
  users.forEach((user) {
    print('ID: ${user.id}, Name: ${user.name}, Age: ${user.age}');
  });
}

void updateUser() async {
  User user = User(id: 1, name: 'Jane Doe', age: 25);
  await DbInfra.update(user);
}

void deleteUser() async {
  User user = User(id: 1);
  await DbInfra.delete(user);
}
回到顶部