Android Firebase实时数据库:如何实现用户多条数据的存储?
解决Firebase保存多条Quote不覆盖的问题
嘿,我来帮你搞定这个数据覆盖的问题!你现在遇到的核心问题是用setValue()直接写入quotes节点,导致每次保存都会替换掉之前的内容。要实现每次新增一条独立的Entry,只需要用到Firebase的push()方法就行,它会自动生成唯一的子节点键,完美解决覆盖问题。
修改后的saveQuote方法
直接把你的代码改成这样就行:
private void saveQuote(){ String name = author.getText().toString(); String quotes = quote.getText().toString(); if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(quotes)){ user = auth.getCurrentUser(); if(user != null){ // 加个空判断,防止未登录时崩了 String userID = user.getUid(); // 关键就是这里的push()!生成唯一子节点再存数据 databaseReference.child(userID).child("quotes").push().setValue(new Author(name, quotes)); Toast.makeText(this, "Saved...", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "请先登录哦", Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(this, "作者名和语句都不能空呀", Toast.LENGTH_SHORT).show(); } }
关键改动说明
- 核心修复:把
child("quotes").setValue(author)改成child("quotes").push().setValue(...)。push()会在quotes节点下生成一个类似-NxYabc123xyz的唯一键,每个键对应一条独立的Quote,这样每次点保存都会新增一条,再也不会覆盖之前的数据啦。 - 额外优化:加了
user != null的判断,避免用户没登录时出现空指针异常;同时调整了Toast提示,让错误信息更准确。 - 小细节:把创建
Author对象的步骤移到了非空判断之后,减少不必要的对象实例化,代码更高效。
修改后的数据库结构
改完之后,你的Firebase数据库结构会变成这样(一目了然):
你的数据库根节点 └── 某个用户的UID └── quotes ├── -NxYabc123... │ ├── name: "鲁迅" │ └── quote: "横眉冷对千夫指" ├── -NxZdef456... │ ├── name: "冰心" │ └── quote: "成功的花,人们只惊羡她现时的明艳" └── ...更多你保存的Entry
顺便提下后续检索数据的方法
如果之后要读取用户所有的Quote,需要遍历quotes节点下的所有子节点,示例代码大概是这样:
// 假设已经拿到当前用户的userID databaseReference.child(userID).child("quotes").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 遍历所有子节点,拿到每条Quote for (DataSnapshot snapshot : dataSnapshot.getChildren()) { Author quote = snapshot.getValue(Author.class); // 这里可以把quote添加到列表,或者展示到UI上 } } @Override public void onCancelled(DatabaseError databaseError) { // 这里处理数据库读取失败的情况,比如弹个提示 } });
内容的提问来源于stack exchange,提问作者AHPV
相关产品推荐
相关产品推荐

