Firebase实时数据库关系

时间:2017-10-06 15:58:09

标签: android firebase firebase-realtime-database nosql

我仍在尝试了解这个NoSQL数据库及其与Android的集成。

之前我有一个SQL数据库,它在表之间有一些关系,比如这个

用户

int id
文字名称 int groupId

int id
文字名称

在Firebase中,我会像这样实现它们,

{
    "user": {   
        "1": {   
            "name": "Jon",   
            "groups": {   
                "group1": true   
            }   
        }   
    },   
    "groups": {   
       "group1": {   
           "name": "Group 1"   
       }
    }
}

直到这里我觉得很好,但是当我用Java编写一些代码时,我不知道如何把我的POJO。 以下是我到目前为止所做的事情:

public class Group {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class User {

    private String name;
    private Group groups;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Group getGroups() {
        return groups;
    }

    public void setGroups(Group groups) {
        this.groups = groups;
    }
}

现在阅读价值观。 (在方法OnCreate上)

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("user");
myRef.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Iterable<DataSnapshot> children = dataSnapshot.getChildren();
        DataSnapshot next = children.iterator().next();
        User value =  next.getValue(User.class);
        Group group = value.getGroups();
    }

    @Override
    public void onCancelled(DatabaseError error) {
             // Failed to read value
    }
});

但是我的组的值始终为null。我究竟做错了什么??如何将用户与群组联系起来?

1 个答案:

答案 0 :(得分:1)

我发现的主要问题是Group类中的User个对象: 实际上,它根本不应该是自定义对象,如果它保留在当前结构中,而是MapThis是地图对象 - 具有keyvalue的集合,就像Realtime Database中的孩子一样。

如果group名称(=键)旁边没有true(=值) - 名称可能已存储在String变量中,但事实并非如此,因为Realtime Database中的每个孩子都必须拥有一个值,并存储一个&#34;虚拟&#34;组名旁边的值使每个组成为Map的一部分。这个电流&#34;虚拟&#34;是一个boolean,这就是为什么这将是群组&#39;数据类型:Map<String, Boolean> groups

因此,您的User课程应如下所示:

public class User {

    private String name;
    private Map<String,Boolean> groups;

使用这种确切类型的一个很好的例子是this one