Java 如何在Android中将Firebase子节点从一个节点移动到另一个节点?
我正在从事一个项目,在该项目中,用户请求我们的代客服务,而代客服务的另一端则接受用户的请求 我使用Firebase作为后端,并根据请求将客户uid保存在“请求”子级 当代客泊车员接受请求时,客户uid应从“请求”节点移动到“进行中”节点Java 如何在Android中将Firebase子节点从一个节点移动到另一个节点?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在从事一个项目,在该项目中,用户请求我们的代客服务,而代客服务的另一端则接受用户的请求 我使用Firebase作为后端,并根据请求将客户uid保存在“请求”子级 当代客泊车员接受请求时,客户uid应从“请求”节点移动到“进行中”节点 我如何才能做到这一点?我建议使用以下方法: public void moveFirebaseRecord(Firebase fromPath, final Firebase toPath) { fromPath.addListenerForSingleV
我如何才能做到这一点?我建议使用以下方法:
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");
}
});
}
这来自以下来源:。我在JavaEE代码和android应用程序中多次使用它
你通过你的fromPath和toPath。这是复制而不是移动,所以原作也将保留在原处。如果要删除,可以在System.out.println(“Success”);之后的fromPath上设置一个值 自编译firebase数据库:11.0.1起,这与新类引用的功能相同(2017年7月5日)
如果要执行同时删除原始文件的移动,可以使用以下代码段:
// 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());
}
});
}
您可以侦听要复制的子项上的值事件、、和#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) {
}
});
它工作正常,但它使用firebase url作为路径(ref)并移动所有子对象。我只想移动一个选中的子对象。如何只移动一个孩子。t如果您有孩子的ID,则可以直接从一个ID移动到另一个ID。它将是:myfirebase.firebase.com/initialPlace/ID到myfirebase.firebase.com/finalPlace/ID。您可以将任何字符串作为变量传递给firebase构造函数。key的值是多少?在javascript对象中,“key”是与非空值关联的任何属性名。“fromPath”将是指向该键的对象分支,“toPath”将是指向该键的对象分支。例如:
{user1:{name:'Jack',address:{line1:'some st',}}}
如果您想在这里移动的是地址,那么键是“address”,fromPath是“/user1/”,toPath是“/junkAddress/user1/”该键也可以是按键。如何获取“key”的值,以便在删除内容时使用。基本上,当我调用removeFromFirebase(fromPath,toPath,key)方法时,我如何获取key的值?您只需要执行toPath.child(key).addListenerForSingleValueEvent(/***/)
从新路径检索相同的值。在这种情况下,如果存在并发移动操作,则相同的代码可能会运行多次。所以你是对的。使用事务还可以简化代码。您只需要从该回调返回null。问题是,在这种情况下,内部集合操作不能失败,否则需要同步运行它。因为,如果是这样的话,你会失去最初的价值。
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) {
}
});