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
相关产品推荐
相关产品推荐

