【问题标题】:How to avoid firebase database child value overwrite issue?如何避免firebase数据库子值覆盖问题?
【发布时间】:2020-11-28 23:22:33
【问题描述】:

下面给出的代码通过“姓名”而不是唯一键在“联系人”下添加子子项。

String name = CName.getText().toString().trim();
DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name);
mDbRef.child("cname").setValue(dCName);
mDbRef.child("pcontact").setValue(dPContact);
mDbRef.child("pdesig").setValue(dPDesig);
mDbRef.child("pemail").setValue(dPEmail);
mDbRef.child("pmobile").setValue(dPMobile);

目的是存储联系方式。公司名称在“名称”中捕获,并将“联系人”添加为子子项。但是每当我尝试以相同的公司名称添加一个新人时,它会用新的人覆盖以前的条目。

您能帮我解决这个问题,以便在同一公司名称下添加更多人吗?

【问题讨论】:

    标签: java android-studio firebase-realtime-database


    【解决方案1】:

    使用push() 为用户生成新的唯一位置的最简单方法。

    String name = CName.getText().toString().trim();
    DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name).push();
    mDbRef.child("cname").setValue(dCName);
    mDbRef.child("pcontact").setValue(dPContact);
    mDbRef.child("pdesig").setValue(dPDesig);
    mDbRef.child("pemail").setValue(dPEmail);
    mDbRef.child("pmobile").setValue(dPMobile);
    

    不相关,我建议将所有值组合成一个映射,并且只调用一次setValue

    String name = CName.getText().toString().trim();
    DatabaseReference mDbRef = mDatabase.getReference().child("Contacts").child(name).push();
    Map<String, Object> values = new HashMap<>();
    
    values.put("cname", dCName);
    values.put("pcontact", dPContact);
    values.put("pdesig", dPDesig);
    values.put("pemail", dPEmail);
    values.put("pmobile", dPMobile);
    
    mDbRef.setValue(values);
    

    只有一次写入操作更有效,但也可以更轻松地保护数据库。

    【讨论】:

    • 感谢您的回复。它按我想要的方式工作。由于我是编程新手,我需要学习更多以更有效的方式编写代码。现在在取回 Firebase 回收器适配器中的值时遇到问题。我的数据库参考是mDatabase = FirebaseDatabase.getInstance().getReference().child("Contacts") 现在它没有选择值,因为它转到了不同的子“名称”。你能告诉我如何参考取回值以在我的适配器中显示它吗?适配器代码如下
    • FirebaseRecyclerOptions&lt;project&gt; options = new FirebaseRecyclerOptions.Builder&lt;project&gt;().setQuery(mDatabase, project.class).build(); FBRA = new FirebaseRecyclerAdapter&lt;project, ProjViewHolder&gt;(options) { protected void onBindViewHolder(@NonNull ProjViewHolder holder, int position, @NonNull project model) { holder.cpname.setText(model.getCname()); holder.ccname.setText(model.getPcontact();
    猜你喜欢
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2015-05-15
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多