如何在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
相关产品推荐
相关产品推荐

