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

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

在本教程中,我们将学习如何在Flutter应用中使用数据库管理插件。这里我们以一个简单的例子来展示如何创建数据库、插入数据、查询数据以及删除数据。

项目结构

在开始之前,让我们先看看项目的基本结构:

my_flutter_app/
├── android/
├── ios/
├── lib/
│   ├── main.dart
│   └── database_helper.dart
├── test/
└── pubspec.yaml

添加依赖

首先,在pubspec.yaml文件中添加必要的依赖项。这里我们使用sqflite作为数据库插件。

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+3
  path_provider: ^2.0.2

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

创建数据库帮助类

接下来,我们需要创建一个帮助类来处理数据库操作。在lib/database_helper.dart文件中编写以下代码:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final _databaseName = "my_database.db";
  static final _databaseVersion = 1;

  // 定义表名和列名
  static final table = 'my_table';
  static final columnId = '_id';
  static final columnName = 'name';

  // 单例模式
  static Database? _database;

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

  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);
    return await openDatabase(
      path,
      version: _databaseVersion,
      onCreate: _onCreate,
    );
  }

  // 创建表
  Future<void> _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE $table (
        $columnId INTEGER PRIMARY KEY,
        $columnName TEXT NOT NULL
      )
    ''');
  }

  // 插入数据
  Future<int> insert(Map<String, dynamic> row) async {
    Database? db = await this.database;
    return await db!.insert(table, row);
  }

  // 查询所有数据
  Future<List<Map<String, dynamic>>> queryAllRows() async {
    Database? db = await this.database;
    return await db!.query(table);
  }

  // 删除数据
  Future<int> delete(int id) async {
    Database? db = await this.database;
    return await db!.delete(
      table,
      where: '$columnId = ?',
      whereArgs: [id],
    );
  }
}

在主文件中使用数据库

现在,我们可以在主文件main.dart中使用上面定义的帮助类来进行数据库操作。以下是完整的main.dart代码:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 数据库示例',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 数据库示例'),
        ),
        body: Home(),
      ),
    );
  }
}

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

class _HomeState extends State<Home> {
  late Future<List<Map<String, dynamic>>> futureData;

  [@override](/user/override)
  void initState() {
    super.initState();
    futureData = DatabaseHelper().queryAllRows();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () async {
              await DatabaseHelper().insert({
                DatabaseHelper.columnName: '测试名称'
              });
              setState(() {
                futureData = DatabaseHelper().queryAllRows();
              });
            },
            child: Text('添加数据'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () async {
              await DatabaseHelper().delete(1); // 假设要删除的数据ID为1
              setState(() {
                futureData = DatabaseHelper().queryAllRows();
              });
            },
            child: Text('删除数据'),
          ),
          SizedBox(height: 20),
          Expanded(
            child: FutureBuilder<List<Map<String, dynamic>>>(
              future: futureData,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return ListView.builder(
                    itemCount: snapshot.data?.length,
                    itemBuilder: (context, index) {
                      return ListTile(
                        title: Text(snapshot.data![index][DatabaseHelper.columnName]),
                      );
                    },
                  );
                } else if (snapshot.hasError) {
                  return Text("${snapshot.error}");
                }
                return CircularProgressIndicator();
              },
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


在 Flutter 中,sqflite 是一个非常流行的插件,用于在移动应用中管理 SQLite 数据库。以下是如何使用 sqflite 插件进行数据库管理的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path: ^1.8.0

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

2. 创建数据库并定义表

接下来,创建一个数据库并定义表结构。通常我们会创建一个单独的类来管理数据库操作。

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  static Database? _database;

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

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

  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'my_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
    );
  }
}

3. 插入数据

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

Future<void> insertUser(Map<String, dynamic> user) async {
  Database db = await DatabaseHelper().database;
  await db.insert(
    'users',
    user,
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

4. 查询数据

你可以使用 query 方法从数据库表中查询数据。

Future<List<Map<String, dynamic>>> getUsers() async {
  Database db = await DatabaseHelper().database;
  return await db.query('users');
}

5. 更新数据

你可以使用 update 方法更新数据库表中的数据。

Future<void> updateUser(Map<String, dynamic> user) async {
  Database db = await DatabaseHelper().database;
  await db.update(
    'users',
    user,
    where: 'id = ?',
    whereArgs: [user['id']],
  );
}

6. 删除数据

你可以使用 delete 方法从数据库表中删除数据。

Future<void> deleteUser(int id) async {
  Database db = await DatabaseHelper().database;
  await db.delete(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );
}

7. 关闭数据库

当你不再需要数据库连接时,可以关闭数据库。

Future<void> closeDatabase() async {
  Database db = await DatabaseHelper().database;
  await db.close();
}

8. 完整示例

以下是一个完整的示例,展示了如何使用 sqflite 插件进行数据库操作:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final dbHelper = DatabaseHelper();

  // Insert a user
  await dbHelper.insertUser({'id': 1, 'name': 'John Doe', 'age': 30});

  // Query all users
  List<Map<String, dynamic>> users = await dbHelper.getUsers();
  print(users);

  // Update a user
  await dbHelper.updateUser({'id': 1, 'name': 'John Smith', 'age': 31});

  // Query all users again
  users = await dbHelper.getUsers();
  print(users);

  // Delete a user
  await dbHelper.deleteUser(1);

  // Query all users one last time
  users = await dbHelper.getUsers();
  print(users);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter SQLite Example'),
        ),
        body: Center(
          child: Text('Check the console for database operations.'),
        ),
      ),
    );
  }
}

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  static Database? _database;

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

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

  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'my_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
    );
  }

  Future<void> insertUser(Map<String, dynamic> user) async {
    Database db = await database;
    await db.insert(
      'users',
      user,
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  Future<List<Map<String, dynamic>>> getUsers() async {
    Database db = await database;
    return await db.query('users');
  }

  Future<void> updateUser(Map<String, dynamic> user) async {
    Database db = await database;
    await db.update(
      'users',
      user,
      where: 'id = ?',
      whereArgs: [user['id']],
    );
  }

  Future<void> deleteUser(int id) async {
    Database db = await database;
    await db.delete(
      'users',
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  Future<void> closeDatabase() async {
    Database db = await database;
    await db.close();
  }
}
回到顶部