You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中sqflite包能否通过键保存数据?该如何实现?

在sqflite中实现键值式数据存储

sqflite是Flutter的关系型数据库插件,本身没有原生的键值对存储接口,但可以通过创建一张极简的表来模拟键值存储功能,完全能实现你需要的“通过键保存数据”的需求,效果类似Hive。

实现步骤

1. 引入依赖

在pubspec.yaml中添加sqflite和path依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.3.0
  path: ^1.8.3

2. 初始化数据库并创建键值表

创建一个工具类,负责数据库的初始化和操作。首先要创建一张用于存储键值对的表,表结构设计为:

  • key:字符串类型,作为唯一标识(主键)
  • value:字符串类型(如果需要存储复杂对象,可先序列化为JSON字符串)

初始化代码示例:

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

class KeyValueStorage {
  static Database? _database;

  // 获取数据库实例
  static Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDB();
    return _database!;
  }

  // 初始化数据库
  static Future<Database> _initDB() async {
    String path = join(await getDatabasesPath(), 'key_value.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: (db, version) async {
        // 创建键值表
        await db.execute('''
          CREATE TABLE key_value (
            key TEXT PRIMARY KEY,
            value TEXT NOT NULL
          )
        ''');
      },
    );
  }
}

3. 封装核心操作方法

在工具类中添加保存、读取、删除数据的方法:

保存/更新数据

因为key是主键,使用insertOrReplace方法,存在则更新,不存在则插入:

// 保存数据,支持更新
static Future<void> saveData(String key, dynamic value) async {
  final db = await database;
  // 复杂对象转JSON字符串存储
  String jsonValue = json.encode(value);
  await db.insert(
    'key_value',
    {'key': key, 'value': jsonValue},
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

通过键读取数据

// 根据键读取数据
static Future<dynamic?> getData(String key) async {
  final db = await database;
  List<Map<String, dynamic>> result = await db.query(
    'key_value',
    where: 'key = ?',
    whereArgs: [key],
  );
  if (result.isNotEmpty) {
    String jsonValue = result.first['value'];
    return json.decode(jsonValue);
  }
  return null;
}

删除指定键的数据

// 删除指定键的数据
static Future<void> deleteData(String key) async {
  final db = await database;
  await db.delete(
    'key_value',
    where: 'key = ?',
    whereArgs: [key],
  );
}

清空所有键值数据

// 清空所有数据
static Future<void> clearAll() async {
  final db = await database;
  await db.delete('key_value');
}

4. 使用示例

在页面中调用这些方法:

// 保存字符串
await KeyValueStorage.saveData('username', 'JohnDoe');
// 保存对象
await KeyValueStorage.saveData('user_info', {'id': 1, 'name': 'John', 'age': 28});

// 读取数据
String? username = await KeyValueStorage.getData('username');
Map? userInfo = await KeyValueStorage.getData('user_info');

// 删除数据
await KeyValueStorage.deleteData('username');

和Hive的区别

  • Hive是原生键值对数据库,无需建表,直接操作键值,适合简单数据存储;
  • sqflite是关系型数据库,需要通过建表模拟键值存储,但支持更复杂的查询和关联操作,适合需要结构化存储的场景。

内容的提问来源于stack exchange,提问作者Nijat Namazzade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:25:09