FlutterUnit数据持久化:shared_preferences与数据库集成

FlutterUnit数据持久化:shared_preferences与数据库集成

【免费下载链接】FlutterUnit 【Flutter 集录指南 App】The unity of flutter, The unity of coder. 【免费下载链接】FlutterUnit 项目地址: https://gitcode.com/GitHub_Trending/fl/FlutterUnit

引言

在Flutter应用开发中,数据持久化是构建稳定、高效应用的关键技术。FlutterUnit作为一个功能丰富的Flutter学习与集录应用,其数据持久化方案采用了shared_preferences与数据库的完美结合。本文将深入解析FlutterUnit中的数据持久化架构,帮助你掌握这两种技术的集成使用。

数据持久化架构概览

FlutterUnit采用分层架构设计,数据持久化层位于modules/basic_system/storage模块中,整体架构如下:

mermaid

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模块进行封装:

mermaid

数据库操作封装

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. 数据分层存储

mermaid

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应用构建出专业级的数据持久化层,确保应用数据的完整性、安全性和高性能访问。

【免费下载链接】FlutterUnit 【Flutter 集录指南 App】The unity of flutter, The unity of coder. 【免费下载链接】FlutterUnit 项目地址: https://gitcode.com/GitHub_Trending/fl/FlutterUnit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值