You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dialog中更新Firebase实时数据库的节点Key?

Firebase实时数据库节点Key修改方案

我需要在Dialog中修改Firebase实时数据库里的节点Key,但发现仅能更新Key对应的值,无法直接修改Key本身。尝试过用HashMap结合updateChildren和setValue方法,都只能更新值,没法更改Key。

初始尝试代码

以下是我最初在Dialog类中编写的更新按钮代码:

user = FirebaseAuth.getInstance().getCurrentUser();
userId = user.getUid();
reference = FirebaseDatabase.getInstance().getReference("Users").child(userId).child("Courses").child(addClassinput.getText().toString());
classBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(!addClassinput.getText().toString().isEmpty()){
                    Map<String, Object> map = new HashMap<>();
                    map.put("getClassName", addClassinput.getText().toString());

                    FirebaseDatabase.getInstance().getReference("Users") .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .child("Courses").child(getClass).updateChildren(map)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void unused) {
                                    Toast.makeText(getContext(), "Updated Successfully", Toast.LENGTH_SHORT).show();
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(getContext(), "Error Updating!", Toast.LENGTH_SHORT).show();
                                }
                            });

                }
                else{
                    Toast.makeText(getContext(), "Invalid Input!", Toast.LENGTH_SHORT).show();
                }
            }

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

            }
        });
    }
});

修改后的可行代码

参考记录迁移方案后,我调整了代码,现在已能正常实现Key的更新,以下是修改后的代码:

user = FirebaseAuth.getInstance().getCurrentUser();
userId = user.getUid();
reference = FirebaseDatabase.getInstance().getReference("Users").child(userId).child("Courses").child(getClass);

classBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ref2 = FirebaseDatabase.getInstance().getReference("Users").child(userId).child("Courses").child(addClassinput.getText().toString());
        moveRecord(reference, ref2);
        FirebaseDatabase.getInstance().getReference("Users").child(userId).child("Courses").child(getClass).removeValue();

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String key = snapshot.getKey();
                if(!addClassinput.getText().toString().isEmpty()){
                    Map<String, Object> map = new HashMap<>();
                    map.put("getClassName", addClassinput.getText().toString());

                    FirebaseDatabase.getInstance().getReference("Users") .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .child("Courses").child(addClassinput.getText().toString()).updateChildren(map)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void unused) {
                                    Toast.makeText(getContext(), "Updated Successfully!", Toast.LENGTH_SHORT).show();
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(getContext(), "Error Updating!", Toast.LENGTH_SHORT).show();
                                }
                            });

                }
                else{
                    Toast.makeText(getContext(), "Invalid Input!", Toast.LENGTH_SHORT).show();
                }
            }

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

            }
        });

    }
});

private void moveRecord(DatabaseReference fromPath, final DatabaseReference toPath) {
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toPath.setValue(dataSnapshot.getValue()).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isComplete()) {
                        Log.d(TAG, "Success!");
                    } else {
                        Log.d(TAG, "Copy failed!");
                    }
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    fromPath.addListenerForSingleValueEvent(valueEventListener);
}

内容的提问来源于stack exchange,提问作者compsci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:25:42