Java 当SingleValueEvent或Transaction的嵌套ValueEventListener失败时,如何回滚到Firebase RealtimeDB for Android中的上一个状态?
我正在开发一个基于Java和Java 当SingleValueEvent或Transaction的嵌套ValueEventListener失败时,如何回滚到Firebase RealtimeDB for Android中的上一个状态?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个基于Java和Firebase的本机Android应用程序,它需要根据特定操作多次写入(使用SingleValueEventListener或事务)不同的实时DB引用。 有点像: 用户单击一个按钮 在DB ref 1的SingleValueEventListener1/Transaction1中,DB reference 1得到更新 成功更新DB ref 1后,在SingleValueEventListener1/Transaction1中嵌套的另一个SingleValueEven
Firebase
的本机Android应用程序,它需要根据特定操作多次写入(使用SingleValueEventListener
或事务)不同的实时DB引用。
有点像:
……等等
ValueEventListener outerListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//do something
//update DBRefOne
DBRefOne.updateChildren(newOuterValue, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
ValueEventListener innerListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//do something
//update DBRefTwo
DBRefTwo.updateChildren(newInnerValue);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// log error
}
};
DBRefTwo.addListenerForSingleValueEvent(innerListener);
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// log error
}
};
DBRefOne.addListenerForSingleValueEvent(outerListener);
这对我来说是一个不平凡但棘手的问题,需要解决,因为大多数应用程序都是以其他方式完成的。我愿意根据你的建议返工。请随时提出建议,任何帮助都是非常谦虚和感激的。有两种方法可以事务性地更新数据:
如果您写入的值基于当前值,则需要使用事务。在这种情况下,确保您正在编写的数据在JSON中彼此接近是很重要的,因为您在更新位置的顶部有效地放置了一个(乐观的)锁。我在下面的选项中给出了一个快速答案。我很感激你在你的问题上做得很透彻,但这使得解析工作相当繁重。我建议编辑时只把重点放在图片上。例如,在您当前的代码片段中,我们不知道
DBRefOne
和DBRefTwo
之间有何关联,也不知道newOuterValue
和newInnerValue
是基于什么。感谢您的回复。我会把你的建议放在手边,以备将来发布。但是,根据您对事务的响应(因为我的值基于当前值),我仍然要问您,当外部事务成功时会发生什么,一旦完成,嵌套的内部事务开始执行,但失败了-如何恢复外部事务的上一个值,存储它不是一个选项,因为届时它可能会更新?事务尝试了很多次,但在一点之后停止。这是一个边缘的情况,但一个有效的。您对此有何看法,请随时告诉我。没有事务嵌套。您必须在单个事务中进行更新,这意味着您必须在JSON中的最低级别运行该事务,您可以在该级别上获得两个值。树中越高,即事务执行情况越差。