FlutterUnit数据持久化:shared_preferences与数据库集成
引言
在Flutter应用开发中,数据持久化是构建稳定、高效应用的关键技术。FlutterUnit作为一个功能丰富的Flutter学习与集录应用,其数据持久化方案采用了shared_preferences与数据库的完美结合。本文将深入解析FlutterUnit中的数据持久化架构,帮助你掌握这两种技术的集成使用。
数据持久化架构概览
FlutterUnit采用分层架构设计,数据持久化层位于modules/basic_system/storage模块中,整体架构如下:
shared_preferences深度解析
核心实现
FlutterUnit通过SpStorage类封装了shared_preferences的所有操作:
class SpStorage {
SpStorage._();
static final SpStorage _instance = SpStorage._();
factory SpStorage() => _instance;
SharedPreferences? _sp;
SharedPreferences get spf => _sp!;
late AppConfigCao _appConfig;
AppConfigCao get appConfig => _appConfig;
Future<void> initSp() async {
if (_sp != null) return;
_sp = _sp ?? await SharedPreferences.getInstance();
_appConfig = AppConfigCao(_sp!);
}
}
配置管理封装
通过AppConfigCao类对配置数据进行统一管理:
class AppConfigCao {
final SharedPreferences sp;
AppConfigCao(this.sp);
// 主题模式设置
bool get isDarkMode => sp.getBool('is_dark_mode') ?? false;
set isDarkMode(bool value) => sp.setBool('is_dark_mode', value);
// 语言设置
String get languageCode => sp.getString('language_code') ?? 'zh';
set languageCode(String value) => sp.setString('language_code', value);
// 字体缩放
double get textScaleFactor => sp.getDouble('text_scale_factor') ?? 1.0;
set textScaleFactor(double value) => sp.setDouble('text_scale_factor', value);
}
使用场景对比
| 数据类型 | shared_preferences适用场景 | 示例 |
|---|---|---|
| 布尔值 | 开关状态、功能启用状态 | 深色模式、通知开关 |
| 字符串 | 用户配置、简单文本 | 语言设置、用户名 |
| 数值 | 计数、配置参数 | 字体大小、页面索引 |
| 字符串列表 | 简单集合数据 | 最近搜索、收藏列表 |
数据库集成方案
数据库选择与架构
FlutterUnit采用SQLite作为主要数据库,通过db_storage模块进行封装:
数据库操作封装
abstract class BaseDao<T> {
final Database db;
BaseDao(this.db);
// 通用CRUD操作
Future<int> insert(String table, Map<String, dynamic> values);
Future<List<Map<String, dynamic>>> query(
String table, {
bool? distinct,
List<String>? columns,
String? where,
List<dynamic>? whereArgs,
String? groupBy,
String? having,
String? orderBy,
int? limit,
int? offset,
});
Future<int> update(
String table,
Map<String, dynamic> values, {
String? where,
List<dynamic>? whereArgs,
});
Future<int> delete(
String table, {
String? where,
List<dynamic>? whereArgs,
});
}
混合存储策略
数据分类存储方案
FlutterUnit根据数据类型采用不同的存储策略:
| 数据类型 | 存储方案 | 优势 | 适用场景 |
|---|---|---|---|
| 用户配置 | shared_preferences | 读写快速、简单 | 主题、语言设置 |
| 应用状态 | shared_preferences | 轻量级、实时 | 页面状态、临时数据 |
| 结构化数据 | SQLite数据库 | 关系型、复杂查询 | 组件数据、学习记录 |
| 大量数据 | SQLite数据库 | 高效存储、索引 | 收藏列表、历史记录 |
性能优化策略
class HybridStorage {
final SpStorage spStorage;
final DatabaseService dbService;
HybridStorage({required this.spStorage, required this.dbService});
// 读写分离策略
Future<T> readWithCache<T>({
required String cacheKey,
required Future<T> Function() fetchFromDb,
Duration cacheDuration = const Duration(minutes: 5),
}) async {
// 先从缓存读取
final cached = spStorage.spf.getString(cacheKey);
if (cached != null) {
return json.decode(cached) as T;
}
// 缓存不存在则从数据库读取
final data = await fetchFromDb();
// 写入缓存
spStorage.spf.setString(cacheKey, json.encode(data));
return data;
}
}
实战应用示例
用户设置管理
class UserSettingsManager {
final SpStorage spStorage;
final DatabaseService dbService;
UserSettingsManager({required this.spStorage, required this.dbService});
// 保存用户主题设置
Future<void> saveThemeSetting(bool isDarkMode) async {
// 立即更新UI状态
spStorage.appConfig.isDarkMode = isDarkMode;
// 异步持久化到数据库
await dbService.execute('''
INSERT OR REPLACE INTO user_settings
(key, value, updated_at)
VALUES (?, ?, ?)
''', ['theme_mode', isDarkMode.toString(), DateTime.now().millisecondsSinceEpoch]);
}
// 获取用户设置
Future<Map<String, dynamic>> getUserSettings() async {
return await spStorage.readWithCache(
cacheKey: 'user_settings',
fetchFromDb: () async {
final results = await dbService.query('user_settings');
return {for (var row in results) row['key']: row['value']};
},
);
}
}
组件数据管理
class WidgetDataRepository {
final DatabaseService dbService;
WidgetDataRepository({required this.dbService});
// 批量插入组件数据
Future<void> batchInsertWidgets(List<Map<String, dynamic>> widgets) async {
final batch = dbService.db.batch();
for (final widget in widgets) {
batch.insert('widgets', widget);
}
await batch.commit(noResult: true);
}
// 分页查询组件
Future<List<Map<String, dynamic>>> getWidgetsByPage({
required int page,
required int pageSize,
String? category,
}) async {
var where = '';
var whereArgs = [];
if (category != null) {
where = 'category = ?';
whereArgs = [category];
}
return await dbService.query(
'widgets',
where: where,
whereArgs: whereArgs,
orderBy: 'name ASC',
limit: pageSize,
offset: (page - 1) * pageSize,
);
}
}
最佳实践总结
1. 数据分层存储
2. 性能优化技巧
- 缓存策略:对频繁读取的数据使用内存缓存
- 批量操作:对大量数据使用数据库批量操作
- 异步处理:所有IO操作都使用异步避免阻塞UI
- 连接池管理:数据库连接复用和超时管理
3. 错误处理机制
class StorageErrorHandler {
static Future<T> withRetry<T>(
Future<T> Function() operation, {
int maxRetries = 3,
Duration delay = const Duration(milliseconds: 100),
}) async {
for (int i = 0; i < maxRetries; i++) {
try {
return await operation();
} catch (e) {
if (i == maxRetries - 1) rethrow;
await Future.delayed(delay * (i + 1));
}
}
throw Exception('Operation failed after $maxRetries retries');
}
}
结语
FlutterUnit的数据持久化方案展示了shared_preferences与数据库集成的强大能力。通过合理的架构设计和性能优化,实现了高效、稳定的数据存储解决方案。这种混合存储策略既保证了简单配置的快速访问,又支持复杂数据的关系型管理,为Flutter应用开发提供了优秀的数据持久化实践范例。
掌握这种集成方案,你将能够为任何Flutter应用构建出专业级的数据持久化层,确保应用数据的完整性、安全性和高性能访问。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



