第一章 本地存储体系架构

Flutter的本地存储系统分为三个核心层级:
1.1 文件存储层:
• 临时目录:存放可清除的缓存数据(通过getTemporaryDirectory()获取路径)

• 文档目录:存放重要持久化数据(通过getApplicationDocumentsDirectory()获取路径)

1.2 键值存储层:
• SharedPreferences:轻量级键值对存储,支持int/String/bool等基础类型

1.3 数据库层:
• Sqflite:基于SQLite的关系型数据库,适用于复杂数据结构

// 获取文档目录路径示例
Future<File> get _localFile async {
  final directory = await getApplicationDocumentsDirectory();
  return File('${directory.path}/data.txt');
}

第二章 文件存储深度解析

2.1 基础操作流程
• 写入文件:

Future<void> writeContent(String content) async {
  final file = await _localFile;
  await file.writeAsString(content); 
}

• 读取文件:

Future<String> readContent() async {
  try {
    final file = await _localFile;
    return await file.readAsString();
  } catch (e) {
    print("读取失败: $e");
    return "";
  }
}

2.2 二进制文件处理

// 图片文件保存
Future<void> saveImage(ByteData data) async {
  final buffer = data.buffer;
  final file = await _localFile;
  await file.writeAsBytes(buffer.asUint8List());
}

常见问题:
• 路径拼接错误:使用path_providerjoin()方法避免跨平台路径问题

• 异步未完成导致空指针:所有操作必须使用await等待完成

• 大文件内存溢出:采用分块读写(openWrite()流式处理)


第三章 SharedPreferences应用实战

3.1 基础API使用

// 存储数据
Future<void> saveCount(int value) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setInt('counter', value);
}

// 读取数据
Future<int> loadCount() async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.getInt('counter') ?? 0;
}

3.2 封装工具类

class SPStorage {
  static Future<void> set(String key, dynamic value) async {
    final prefs = await SharedPreferences.getInstance();
    if (value is int) {
      await prefs.setInt(key, value);
    } else if (value is String) {
      await prefs.setString(key, value);
    } // 其他类型处理...
  }

  static Future<dynamic> get(String key) async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.get(key);
  }
}

常见问题:
• 类型不匹配:get方法需显式指定类型(如getString()

• 异步未处理导致数据不同步:必须使用await确保写入完成

• 存储容量限制:单条数据不宜超过1MB(建议改用数据库)


第四章 Sqflite数据库进阶

4.1 数据库初始化

Future<Database> initDB() async {
  return openDatabase(
    join(await getDatabasesPath(), 'app.db'),
    onCreate: (db, version) {
      db.execute('''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT NOT NULL,
          age INTEGER
        )
      ''');
    },
    version: 1,
  );
}

4.2 CRUD操作

// 插入数据
Future<void> insertUser(User user) async {
  final db = await database;
  await db.insert('users', user.toMap());
}

// 查询数据
Future<List<User>> getUsers() async {
  final db = await database;
  final maps = await db.query('users');
  return List.generate(maps.length, (i) => User.fromMap(maps[i]));
}

4.3 事务处理

Future<void> batchUpdate() async {
  final db = await database;
  await db.transaction((txn) async {
    await txn.update('users', {'age': 30}, where: 'age < ?', whereArgs: [30]);
    await txn.delete('orders', where: 'status = ?', whereArgs: ['expired']);
  });
}

常见问题:
• 数据库锁死:确保每个操作完成后关闭数据库连接

• 版本升级失败:使用onUpgrade处理表结构变更

• Web平台不兼容:Flutter Web需使用shared_preferences_web或IndexedDB替代


第五章 企业级存储方案设计

5.1 混合存储策略
• 高频小数据:SharedPreferences(如用户设置)

• 结构化数据:Sqflite(如订单记录)

• 大文件资源:文件存储(如用户上传的图片)

5.2 数据加密方案

// 使用flutter_secure_storage加密敏感数据
const storage = FlutterSecureStorage();
await storage.write(key: 'token', value: 'encrypted_data');
String token = await storage.read(key: 'token');

5.3 云同步机制

// 结合Firebase实现跨设备同步
FirebaseFirestore.instance
  .collection('users')
  .doc(userId)
  .snapshots()
  .listen((snapshot) {
    _updateLocalDB(snapshot.data());
  });

第六章 高频问题解决方案

6.1 数据丢失问题
• 现象:应用重启后数据未保存

• 解决方案:

  1. 检查异步操作是否使用await
  2. 通过WidgetsBindingObserver监听应用生命周期自动保存

6.2 跨平台兼容性问题
• Flutter Web适配:

• 使用shared_preferences_web替代Sqflite

• 大型数据改用IndexedDB(通过idb库)

6.3 性能优化策略
• 数据库索引优化:

CREATE INDEX user_name_idx ON users(name);

• 文件缓存淘汰:采用LRU算法定期清理临时目录

• 批量写入优化:使用事务处理替代多次单条操作