Android中如何获取Firebase实时数据库push生成的唯一ID以更新数据
解决Firebase Realtime Database动态ID节点的更新问题
核心问题很明确:要更新对应节点,你必须拿到该数据对应的push生成的唯一ID,得从数据模型和数据读写环节入手处理:
1. 给数据模型类新增ID字段
假设你的数据类是Homework,直接加个id字段用来存储push生成的节点键,同时补上对应的getter/setter和构造方法:
public class Homework { private String name; private String addHomeworkDescription; private String id; // 用来存push生成的唯一ID // Firebase要求的空构造方法 public Homework() {} // 带参构造,包含id public Homework(String name, String addHomeworkDescription, String id) { this.name = name; this.addHomeworkDescription = addHomeworkDescription; this.id = id; } // id的getter和setter public String getId() { return id; } public void setId(String id) { this.id = id; } // 其他字段的getter/setter public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddHomeworkDescription() { return addHomeworkDescription; } public void setAddHomeworkDescription(String addHomeworkDescription) { this.addHomeworkDescription = addHomeworkDescription; } }
2. 新增数据时保存ID到模型
当你往Firebase写入新数据时,要先获取push生成的ID,再把它存入模型后写入数据库:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Homework").child(uid); String pushId = myRef.push().getKey(); // 获取push生成的唯一ID Homework newHomework = new Homework("作业标题", "作业描述", pushId); myRef.child(pushId).setValue(newHomework); // 用pushId作为节点键写入数据
3. 在Adapter中用ID定位节点更新
回到你原有的编辑按钮代码,修改提交点击事件,直接通过myItems.getId()拿到对应的ID,填入child()即可:
submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Map<String,Object> map=new HashMap<>(); map.put("name",title.getText().toString()); map.put("addHomeworkDescription",description.getText().toString()); DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Homework"); String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // 获取当前item对应的push ID String targetPushId = myItems.getId(); // 定位到目标节点更新数据 myRef.child(uid).child(targetPushId) .updateChildren(map); dialogPlus.dismiss(); } });
4. 读取数据时给模型赋值ID
从Firebase读取数据到Adapter时,别忘了把节点的key赋值给模型的id字段:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Homework").child(uid); myRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { List<Homework> homeworkList = new ArrayList<>(); for(DataSnapshot childSnapshot : snapshot.getChildren()){ Homework homework = childSnapshot.getValue(Homework.class); // 把节点的key赋值给模型的id字段 homework.setId(childSnapshot.getKey()); homeworkList.add(homework); } // 更新你的Adapter数据 yourAdapter.updateData(homeworkList); } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理错误 } });
内容的提问来源于stack exchange,提问作者Nowty
相关产品推荐
相关产品推荐

