【发布时间】:2019-03-12 15:43:02
【问题描述】:
我正在开发一个现有的带有解析后端的 Android 应用程序(localDatastore 已启用但未在此上下文中使用),它具有以下对象结构:
对象 A 有一个对象 B 数组
对象 B 有一个对象 C 数组
我使用 saveInBackground 保存此对象结构,以反向顺序(C,B,A)在完成的 SaveCallback 中调用下一个 saveInBackground。对于工作正常的内部两个,但没有保存顶级对象。 代码如下(frame、newStep 和 order 是继承自 ParseObject 类的类的对象)
frame.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.i("Info", "frame.save callback OK");
frames.add(frame);
newStep.setTimeFrames(frames);
newStep.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.i("Info", "newStep.save callback OK");
List<ProcessingStep> steps = order.getProcessingSteps();
steps.add(newStep);
order.setProcessingSteps(steps);
order.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null){
Log.i("Info", "order.save callback OK");
}else{
Log.i("Info", "order.save callback FAIL");
}
}});
} else {
Log.i("Info", "newStep.save callback FAIL");
e.printStackTrace();
}
}
});
} else {
Log.i("Info", "frame.save callback FAIL");
e.printStackTrace();
}
}
});
在控制台日志中我只看到“frame.save callback OK”,“newStep.saveInBackground()”似乎也被执行了(对象出现在后端)但是我从来没有在回调中收到日志消息。
如果我先同步保存所有对象而不先相互引用,然后在此处调用代码,它似乎可以工作(至少工作一次)但需要永远(几分钟)。来自后端的查询非常快,框架对象也几乎立即保存,但完成回调似乎有问题。当它失败时,我没有得到任何异常,记录任何它似乎静默失败的东西。
我正在寻找 Parse 为何会出现这种行为以及如何修复它的任何见解。
编辑: 问题似乎与双重关系(A 到 B 和 B 到 C)有关。如果我只尝试使用 A 到 B 或 B 到 C,它工作得很好。然而,对我来说仍然很神秘的是,为什么用回调拆分操作似乎不起作用。
【问题讨论】:
-
存储 newStep 对象似乎存在问题,因为您没有看到“newStep.save callback OK”日志。您可以发布您的 NewStep 课程代码吗?你能检查你的 Parse 服务器日志吗?
-
解析服务器日志是干净的。 newStep 对象的类只是扩展 ParseObject 实现 Parcelable(只有一堆 getter 和 setter)
-
它的属性是什么?有什么特别之处吗?
-
最值得注意的是一个指向最低对象的指针数组(上面代码sn-p中的帧)。
-
你确定 timeFrames 数组中的所有帧在存储 newStep 之前都存储在 Parse 中吗?