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

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

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

什么是这个?

我们希望有一个与供应商无关的API来访问类似SQL的数据库。我们几年前就弃用了之前的草案,现在希望设计一个更简单、更好的方案。

API的设计还在进行中。我们鼓励大家讨论这个API应该是什么样子,并欢迎提出拉取请求。:)

由于提供的内容和示例代码比较有限,我将基于Flutter常见的数据库插件sqflite(一个常用的SQLite数据库插件)来创建一个完整的示例demo,以帮助您理解如何在Flutter中使用数据库管理插件。

示例Demo

以下是一个简单的Flutter应用程序示例,它展示了如何使用sqflite插件来创建数据库、插入数据和查询数据。

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

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

接下来,创建一个数据库帮助类DatabaseHelper.dart,用于管理数据库连接和操作:

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

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

  // 表名
  static final table = 'my_table';

  // 列名
  static final columnId = '_id';
  static final columnName = 'name';

  // 单例模式
  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  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 _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
            $columnName TEXT NOT NULL
          )
          ''');
  }

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

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

  // 根据ID查询数据
  Future<List<Map<String, dynamic>>> queryById(int id) async {
    Database db = await instance.database;
    return await db.query(table, where: '$columnId = ?', whereArgs: [id]);
  }

  // 更新数据
  Future<int> update(Map<String, dynamic> row) async {
    Database db = await instance.database;
    int id = row[columnId];
    return await db.update(
      table,
      row,
      where: '$columnId = ?',
      whereArgs: [id],
    );
  }

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

然后,在主应用程序文件main.dart中使用该数据库帮助类:

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

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

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

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _insertData() async {
    Map<String, dynamic> row = {DatabaseHelper.columnName: 'Item $_counter'};
    final id = await DatabaseHelper.instance.insert(row);
    print('Inserted row id: $id');
    setState(() {
      _counter++;
    });
  }

  void _queryData() async {
    final allRows = await DatabaseHelper.instance.queryAllRows();
    print('Query all rows:');
    allRows.forEach((row) => print(row));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _insertData,
              child: Text('Insert Data'),
            ),
            ElevatedButton(
              onPressed: _queryData,
              child: Text('Query Data'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,我可以为你提供一个关于如何在Flutter中使用数据库管理插件(如sqlite3floor)的示例。这里我将使用floor插件,因为它是一个比较流行且易于使用的ORM(对象关系映射)库,可以简化SQLite数据库的操作。

1. 添加依赖

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

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

然后运行flutter pub get来获取依赖。

2. 创建数据实体

创建一个数据实体类,并使用@Entity注解。例如,我们创建一个User实体:

import 'package:floor/floor.dart';

@Entity(tableName: 'users')
data class User(
  @PrimaryKey(autoGenerate: true) val id: Int,
  @ColumnInfo(name: 'name') val name: String,
  @ColumnInfo(name: 'age') val age: Int,
)

3. 创建DAO接口

DAO(数据访问对象)接口用于定义数据库操作。使用@Dao注解来标记DAO接口,并定义CRUD(创建、读取、更新、删除)操作:

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

@Dao
interface UserDao {
  @Insert(onConflict: ConflictStrategy.REPLACE)
  Future<Void> insertUser(User user);

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

  @Update
  Future<Void> updateUser(User user);

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

4. 创建数据库抽象类

创建一个数据库抽象类,并使用@Database注解。这个类将包含所有DAO接口,并用于打开数据库连接:

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

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

5. 打开数据库连接

在你的应用程序中,你需要打开数据库连接。这通常在ApplicationViewModel类中完成:

import 'package:flutter/material.dart';
import 'package:floor/floor.dart';
import 'app_database.dart';
import 'user_dao.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final database = await $FloorDatabase.databaseBuilder('app_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: HomeScreen(userDao: userDao),
    );
  }
}

class HomeScreen extends StatefulWidget {
  final UserDao userDao;

  HomeScreen({required this.userDao});

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

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Floor Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            final user = User(name: 'John Doe', age: 30);
            await widget.userDao.insertUser(user);
            final allUsers = await widget.userDao.getAllUsers();
            print(allUsers);
          },
          child: Text('Insert User'),
        ),
      ),
    );
  }
}

6. 运行应用

确保你的开发环境已经设置好,然后运行你的Flutter应用。你应该能够在控制台中看到插入的用户信息。

这个示例展示了如何使用floor插件在Flutter中管理SQLite数据库。你可以根据需要扩展这个示例,添加更多的实体和DAO操作。

回到顶部