APP重启后已下载导入的JSON数据丢失,如何实现持久化存储?
解决APP重启后JSON数据丢失的问题
嘿,这个问题我太熟了!你现在的代码只是把服务器返回的JSON读到了内存里的StringBuffer——APP一重启,内存里的临时数据就被清空了,自然就丢失了。核心思路是把数据持久化存储到设备本地,给你几个实用的方案,结合你的现有代码来改:
方案一:用SharedPreferences(适合小体积JSON)
如果你的JSON内容不大(比如几百KB以内),用SharedPreferences是最简单的方式,它是Android自带的轻量级存储工具:
存储JSON(读取完流之后加这段)
// 读取完JSON数据后,把它存入SharedPreferences SharedPreferences sharedPref = getSharedPreferences("MyAppData", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("saved_server_json", jsonData.toString()); editor.apply(); // 异步保存,不会阻塞主线程,推荐用这个
重启APP后读取JSON
在APP启动的入口(比如Activity的onCreate)里加这段:
// 从SharedPreferences读取保存的JSON SharedPreferences sharedPref = getSharedPreferences("MyAppData", Context.MODE_PRIVATE); String savedJson = sharedPref.getString("saved_server_json", null); if (savedJson != null) { // 把读取到的字符串重新转成StringBuffer,继续后续处理 StringBuffer jsonData = new StringBuffer(savedJson); // 这里写你原来解析/使用JSON的逻辑 } else { // 第一次启动或者之前没保存过,去服务器下载数据 }
方案二:内部存储文件(适合中等大小JSON)
如果JSON体积比较大(比如几MB),用文件存储更合适,Android允许APP在内部存储创建私有文件:
存储JSON(读取完流之后加这段)
// 将JSON写入内部存储的私有文件 try { FileOutputStream fos = openFileOutput("server_data.json", Context.MODE_PRIVATE); fos.write(jsonData.toString().getBytes()); fos.close(); } catch (IOException e) { e.printStackTrace(); // 实际项目里要处理异常,比如提示用户保存失败 }
重启APP后读取JSON
同样在启动入口加这段:
StringBuffer jsonData = new StringBuffer(); try { // 打开内部存储的文件 FileInputStream fis = openFileInput("server_data.json"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { jsonData.append(line); } fis.close(); } catch (IOException e) { // 文件不存在(第一次启动),这里可以处理成去服务器下载 e.printStackTrace(); } // 继续处理jsonData
方案三:Room数据库(适合复杂结构的JSON)
如果你的JSON是结构化的数据(比如用户列表、商品数组),需要经常查询、修改,那用Room数据库是最优解,它能把JSON解析成实体类存储:
大概步骤(简化版)
- 定义对应JSON结构的实体类:
@Entity(tableName = "server_items") public class ServerItem { @PrimaryKey(autoGenerate = true) public int id; public String title; public String content; // 其他字段对应JSON里的键 }
- 创建Room的DAO和数据库类(具体写法可以参考Android官方文档)
- 解析JSON为
ServerItem列表,插入数据库 - 重启APP时,从数据库查询所有
ServerItem,再转换成需要的格式
注意事项
- 选择存储方式要看JSON的大小和使用场景:小数据用SharedPreferences,中等用文件,复杂结构用Room
- 所有IO操作(读写文件/数据库)都不要放在主线程,建议用Kotlin协程、RxJava,避免ANR崩溃
- 记得处理异常,比如存储失败时给用户提示,或者重新下载数据
内容的提问来源于stack exchange,提问作者Mr.AndroidDev




