Я однажды написал метод, который сначала создает копию, а затем удаляет исходный узел.это только нужно было бы перенести с Java
на JavaScript
, что должно быть довольно простой задачей.порядок операций, как минимум, работает.как правило, вы должны заменить .on('value')
на .once('value')
, потому что дальнейших событий не будет - и удаление должно быть зафиксировано ChildEventListener
на родительском узле (или, тем не менее, это называется в JavaScript
).если вы хотите написать подлинный сценарий, инкапсуляция в транзакции будет иметь смысл для данного сценария.
/** relocates a record from one to another path (v2). */
protected void move(final DatabaseReference source, final DatabaseReference target) {
source.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
target.setValue(snapshot.getValue(), new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
/* if not the operation has failed */
if (databaseError != null) {
if(mDebug) {Log.w(LOG_TAG, databaseError.getMessage());}
} else {
/* remove the source path */
source.removeValue(new DatabaseReference.CompletionListener(){
@Override
public void onComplete(DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
if(mDebug) {Log.d(LOG_TAG, "moved " + source.toString() + " to " + target.toString());}
}
});
}
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
if(mDebug) {Log.w(LOG_TAG, databaseError.getMessage());}
}
});
}