离线模式下保存含ParseFile的ParseObject报错,求解决方案
解决Parse离线模式下Pin含ParseFile的Object报错问题
这个问题我之前做Parse离线功能时也踩过坑,核心原因是Parse的本地pin机制要求关联的ParseFile必须先完成本地持久化,而默认的saveInBackground()是上传到服务器,离线环境下无法执行,所以得用Parse专门提供的本地保存文件的重载方法。
具体解决方案步骤:
- 先开启本地数据存储:这是所有离线操作的前提,必须在Parse初始化之前调用:
Parse.enableLocalDatastore(getApplicationContext()); Parse.initialize(new Parse.Configuration.Builder(getApplicationContext()) .applicationId("你的APP_ID") .clientKey("你的CLIENT_KEY") .server("你的服务器地址") .build());
- 本地保存ParseFile(不上传服务器):使用
ParseFile的重载saveInBackground方法,第三个参数设为true,这个参数会让Parse只把文件数据存储到本地,而不尝试上传到服务器:
// 获取位图 ByteArrayOutputStream baos = new ByteArrayOutputStream(); mBitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos); byte[] data = baos.toByteArray(); Random random = new Random(); // 创建ParseFile,建议给文件加合理后缀名,方便后续识别 final ParseFile file = new ParseFile(random.nextInt(10000) + "_avatar.jpg", data); // 本地保存文件,第三个参数true是核心 file.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { // 文件已成功本地存储,现在可以关联到ParseObject并pin ParseObject userProfile = new ParseObject("UserProfile"); userProfile.put("avatar", file); // Pin对象到本地离线存储 userProfile.pinInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { // 成功完成本地pin,离线环境下也能查询到这个对象和关联的文件 } else { // 处理pin失败的错误 Log.e("ParsePin", "Pin失败: " + e.getMessage()); } } }); } else { // 处理文件本地保存失败的错误 Log.e("ParseFile", "本地保存文件失败: " + e.getMessage()); } } }, null, true); // 第三个参数true:仅本地保存,不上传服务器
额外说明:
- 后续同步到服务器:当网络恢复后,你可以调用
file.saveInBackground()把本地文件上传到服务器,同时调用userProfile.saveInBackground()同步pin的对象到云端。 - 查询本地pin的对象:使用
ParseQuery.fromLocalDatastore()来查询离线存储的对象,关联的ParseFile会自动从本地加载。
内容的提问来源于stack exchange,提问作者Bro
相关产品推荐
相关产品推荐

