我仍在尝试了解这个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。我究竟做错了什么??如何将用户与群组联系起来?
答案 0 :(得分:1)
我发现的主要问题是Group
类中的User
个对象:
实际上,它根本不应该是自定义对象,如果它保留在当前结构中,而是Map
。 This是地图对象 - 具有key
和value
的集合,就像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。