Android

How to move Firebase child from one node to another in Android?

Как переместить дочерний элемент Firebase с одного узла на другой в Android?

Я работаю над проектом, в котором пользователь запрашивает наши услуги valet, а на другом конце valet принимает запрос.

Я использую Firebase в качестве серверной части, и по запросу customer uid сохраняется для дочернего элемента 'request'.

Когда valet принимает запрос, uid клиента должен переместиться с узла 'request' на узел 'on progress'.

Как я могу это сделать?

Переведено автоматически
Ответ 1

Я рекомендую использовать это :

public void moveFirebaseRecord(Firebase fromPath, final Firebase toPath)
{
fromPath.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
toPath.setValue(dataSnapshot.getValue(), new Firebase.CompletionListener()
{
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase)
{
if (firebaseError != null)
{
System.out.println("Copy failed");
}
else
{
System.out.println("Success");
}
}
});
}

@Override
public void onCancelled(FirebaseError firebaseError)
{
System.out.println("Copy failed");
}
});
}

Это взято из этого источника: https://gist.github.com/katowulf/6099042 . Я использовал это несколько раз в своем коде JavaEE, а также в своем приложении для Android.

Вы передаете свои fromPath и toPath . Это копирование, а не перемещение, поэтому оригинал также останется на своем первоначальном месте. Если вы хотите удалить, вы можете установить значение в fromPath сразу после System.out.println("Успех"); .

Ответ 2

Начиная с версии compile firebase-database: 11.0.1, это та же функция с новыми ссылками на классы (https://firebase.google.com/support/guides/firebase-android 05 июля 2017 г.)

private void moveGameRoom(final DatabaseReference fromPath, final DatabaseReference toPath) {
fromPath.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
toPath.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) {
if (firebaseError != null) {
System.out.println("Copy failed");
} else {
System.out.println("Success");

}
}
});

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
}
Ответ 3

Если вы хотите выполнить перемещение, которое также приведет к удалению оригинала, вы можете использовать следующий фрагмент:

// In this piece of code, "fromPath" and "toPath" parameters act like directories.
private void removeFromFirebase(final DatabaseReference fromPath, final DatabaseReference toPath, final String key) {
fromPath.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
// Now "DataSnapshot" holds the key and the value at the "fromPath".
// Let's move it to the "toPath". This operation duplicates the
// key/value pair at the "fromPath" to the "toPath".
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
toPath.child(dataSnapshot.getKey())
.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
Log.i(TAG, "onComplete: success");
// In order to complete the move, we are going to erase
// the original copy by assigning null as its value.
fromPath.child(key).setValue(null);
}
else {
Log.e(TAG, "onComplete: failure:" + databaseError.getMessage() + ": "
+ databaseError.getDetails());
}
}
});
}

@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, "onCancelled: " + databaseError.getMessage() + ": "
+ databaseError.getDetails());
}
});
}
Ответ 4

вы можете прослушать событие value для своего дочернего элемента, которое вы хотите скопировать ,, и #onDataChange получит ссылку на нового дочернего элемента и установит значение DataSnapshot для этого дочернего элемента, как показано в примере кода ниже

FirebaseDatabase.getInstance().getReference("childYouWantToCopy")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
FirebaseDatabase.getInstance().getReference("ChildCopyTo").setValue(dataSnapshot.getValue());
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
2024-01-07 13:48 java android firebase firebase-realtime-database