首页 > 解决方案 > Flutter/Firebase:我想更新现有值,但正在创建新值

问题描述

我正在做一个颤振项目,这是我的代码:

    String vl = store.reference().child("Volunteers/Aadithya").push().key;
    vlRef = FirebaseDatabase.instance.reference().child("Volunteers/Aadithya");
    vlRef.child(vl).update({
      "Contributions": int.parse(count)+1,
    }).then((_) {
    }).catchError((onError) {
      Scaffold.of(context)
          .showSnackBar(SnackBar(content: Text(onError)));
    }); 

Contributions里面是一个数据记录Aadithya。我需要单独更新它的值。但是发生的是,内部正在创建一个新的子记录Aadithyacontributions它的数据类型是

请帮忙:

数据库

标签: firebaseflutterdartfirebase-realtime-database

解决方案


如果要更新此用户的 displayName:

var db = firebase.database();
db.ref("-Users/-KUanJA9egwmPsJCxXpv/displayName").set("New trainer");

或者,您也可以通过以下方式获得相同的结果:

db.ref("-Users/-KUanJA9egwmPsJCxXpv").update({ displayName: "New trainer" });

但是您很可能不知道用户的 ID,在这种情况下,您需要先查找:

var query db.ref("-Users").orderByChild("uid").equalTo("jRXMsNZHR2exqifnR2rXcceEMxF2");
query.once("child_added", function(snapshot) {
  snapshot.ref.update({ displayName: "New trainer" })
});

不过,关于您的数据结构的最后一点评论:您似乎在存储用户配置文件,但您将它们存储在推送 ID 下。对于这种类型的结构,我们通常建议您将每个用户存储在他们的 UID 下:

-Users
      jRXMsNZHR2exqifnR2rXcceEMxF2
         displayName:"Test Trainer"    
         email:"test@gmail.com"

使用这样的结构,您消除了将同一用户存储两次的任何机会。此外,您现在无需查询即可更新用户的显示名称:

var currentUser = firebase.auth().currentUser;
db.ref("-Users/"+currentUser.uid).update({ displayName: "New trainer" });

推荐阅读