如何在SharedPreferences中存储Set<Set<String>>类型数据?
SharedPreferences确实只支持直接存储基本类型和Set<String>,嵌套的Set<Set<String>>没法直接用putStringSet()存。不过有两个很实用的方案可以搞定这个问题,我平时做Android开发经常用:
方案一:用Gson序列化(推荐)
Gson可以轻松把复杂集合转换成JSON字符串,存成普通的String类型,取出来再反序列化回去,代码简洁还不容易出错。
步骤:
- 首先确保你的项目里引入了Gson依赖(如果是Android项目,在build.gradle里加):
implementation 'com.google.code.gson:gson:2.10.1'
- 存储时,把
Set<Set<String>>转成JSON字符串:
SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE); Set<Set<String>> nestedSet = new HashSet<>(); // 假设你已经填充了nestedSet的数据 Gson gson = new Gson(); String nestedSetJson = gson.toJson(nestedSet); prefs.edit().putString("nested_set_key", nestedSetJson).apply();
- 读取时,把JSON字符串反序列化成
Set<Set<String>>:
String nestedSetJson = prefs.getString("nested_set_key", "[]"); Type type = new TypeToken<Set<Set<String>>>(){}.getType(); Set<Set<String>> nestedSet = gson.fromJson(nestedSetJson, type);
方案二:手动拼接字符串(无需第三方库)
如果不想引入Gson,也可以自己手动处理:把内层的每个Set<String>用特定分隔符拼成一个字符串,然后外层变成Set<String>,再用putStringSet()存储。读取的时候再反向拆分。
步骤:
- 存储时,转换嵌套集合:
SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE); Set<Set<String>> nestedSet = new HashSet<>(); // 填充数据 Set<String> flatSet = new HashSet<>(); // 用两个不同的分隔符,比如内层用"|",外层用普通的Set存储(SharedPreferences会自动处理外层的Set) for (Set<String> innerSet : nestedSet) { String innerStr = String.join("|", innerSet); flatSet.add(innerStr); } prefs.edit().putStringSet("nested_set_key", flatSet).apply();
- 读取时,拆分字符串还原嵌套集合:
Set<String> flatSet = prefs.getStringSet("nested_set_key", new HashSet<>()); Set<Set<String>> nestedSet = new HashSet<>(); for (String innerStr : flatSet) { Set<String> innerSet = new HashSet<>(Arrays.asList(innerStr.split("\\|"))); nestedSet.add(innerSet); }
⚠️ 注意:这个方法要确保你的数据里不会出现你用的分隔符(比如上面的"|"),如果可能出现,记得先对数据做转义处理,避免拆分出错。
内容的提问来源于stack exchange,提问作者sagar suri
相关产品推荐
相关产品推荐

