Android - 在Firebase上保存具有特定键的对象属性列表

时间:2017-07-19 18:46:30

标签: android json firebase firebase-realtime-database

让我们考虑一个带有“电子邮件”属性的“UserBean”ArrayList<EmailBean>

保存在 Firebase 时,它就像:

"users" : {
   "$userID" : {
        "emails" : [
            "0" : {
                "type" : "first",
                "address" : "google@google.com",
                "private" : true
            },
            "1" : {
                "type" : "second",
                "address" : "firebase@firebase.com",
                "private" : false"
            }
        ],
        "name" : "Mitch"
    }
}

所以有可能实现这样的目标:

"users" : {
   "$userID" : {
        "emails" : [
            "first" : {
                "address" : "google@google.com",
                "private" : true
            },
            "second" : {
                "address" : "firebase@firebase.com",
                "private" : false
            }
        ],
        "name" : "Mitch"
    }
}

我宁愿不必一次保存一个地址。

也许有一个注释要告诉 Firebase 将此属性用作键?

问候。

1 个答案:

答案 0 :(得分:1)

我建议您使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference emailsRef = rootRef.child("users").child(userId).child("emails");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String type = ds.child("type").getValue(String.class);
            ds.child("type").getRef().getParent().setValue(type);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
emailsRef.addListenerForSingleValueEvent(eventListener);

我尝试使用此代码了什么?因此,为了达到您想要的效果,首先我们获得了您的type密钥的价值。然后我们在树中进行一步,并为每个特定节点设置具有type键值的partent。

使用type的值而不是0, 1 and so on来完成工作,只需直接在引用上使用type key方法从每个节点中删除removeValue()