如何在SharedPreferences中存储多份用户数据,通过用户名查询对应信息
实现方案
核心逻辑是将用户数据整理为以用户名为key的映射结构,序列化后存入SharedPreferences,读取时直接通过key即可秒查对应信息,无需遍历。
前置准备
需要引入官方shared_preferences依赖,同时依赖Dart内置的dart:convert做JSON序列化:
- 先在
pubspec.yaml的dependencies节点下添加:
shared_preferences: ^2.2.2
- 在用到的代码文件头部导入依赖:
import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert';
存储逻辑实现
修改你的storeUsersInfo方法如下:
storeUsersInfo() async { print('STORE CALLED'); QuerySnapshot querySnapshot = await DatabaseMethods().getUsers(); var length = querySnapshot.docs.length; print(length); // 构建以用户名为key的用户信息Map Map<String, Map<String, String>> userMap = {}; for (var doc in querySnapshot.docs) { // 假设你的文档ID就是用户名,如果你是把用户名存在字段里就改成doc["username"] String username = doc.id; String name = doc["name"]; String profilePicUrl = doc["profileURL"]; userMap[username] = { "name": name, "profileURL": profilePicUrl }; } // 序列化为JSON字符串存入SharedPreferences SharedPreferences sp = await SharedPreferences.getInstance(); await sp.setString("all_user_info", jsonEncode(userMap)); }
快速查询实现
需要查询指定用户名的信息时调用如下方法即可:
Future<Map<String, String>?> getUserInfoByUsername(String username) async { SharedPreferences sp = await SharedPreferences.getInstance(); String? userInfoStr = sp.getString("all_user_info"); if (userInfoStr == null) return null; Map userMap = jsonDecode(userInfoStr); return userMap[username] as Map<String, String>?; }
注意事项
- 如果你的Firebase用户数据有更新,需要重新调用
storeUsersInfo方法更新本地缓存 - SharedPreferences适合存储轻量数据,如果你的用户量超过1000条,建议改用Hive、SQLite这类本地数据库方案,性能会更好
内容的提问来源于stack exchange,提问作者vikrant yadav
相关产品推荐
相关产品推荐

