You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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解析成实体类存储:

大概步骤(简化版)

  1. 定义对应JSON结构的实体类:
@Entity(tableName = "server_items")
public class ServerItem {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String title;
    public String content;
    // 其他字段对应JSON里的键
}
  1. 创建Room的DAO和数据库类(具体写法可以参考Android官方文档)
  2. 解析JSON为ServerItem列表,插入数据库
  3. 重启APP时,从数据库查询所有ServerItem,再转换成需要的格式

注意事项

  • 选择存储方式要看JSON的大小和使用场景:小数据用SharedPreferences,中等用文件,复杂结构用Room
  • 所有IO操作(读写文件/数据库)都不要放在主线程,建议用Kotlin协程、RxJava,避免ANR崩溃
  • 记得处理异常,比如存储失败时给用户提示,或者重新下载数据

内容的提问来源于stack exchange,提问作者Mr.AndroidDev

火山引擎 最新活动