我有一个与如何使用firebase保存用户信息有关的问题。我扩展了用户身份验证并在用户的json树上创建了一个新节点,每个用户都有自己的firebase生成的id,用户信息在该key / id内。问题是,每次我这样做:
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (number.equals(String.valueOf(user.getPhone()))) {
Log.d("here", "i entered");
key = snapshot.getKey();
userFriend = user;
}
}
我将用户信息中的用户信息映射到我的代码中的用户模型中,但在我的项目中,我需要为特定用户提供密钥。在这里,我只是在没有密钥的情况下映射用户信息。有没有办法在模型中添加字符串id并自动将密钥添加到该id字段?
的usermodel
package com.esmad.pdm.friendlymanager.model;
import java.util.ArrayList;
public class User {
private String id;
private String username;
private int age = -1;
private String phone;
private int gamesPlayed = 0;
private ArrayList<User> FriendList = new ArrayList<User>();
// CONSTRUCTOR
public User() {
}
public User(String username) {
this.username = username;
}
// GETTERS & SETTERS
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public User(String id, String username, int age, String phone, int gamesPlayed, ArrayList<User> users) {
this.username = username;
this.age = age;
this.phone = phone;
this.gamesPlayed = gamesPlayed;
this.FriendList = users;
}
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public int getGamesPlayed() { return gamesPlayed; }
public void setGamesPlayed(int gamesPlayed) { this.gamesPlayed = gamesPlayed; }
public ArrayList<User> getUsers() { return FriendList; }
public void setUsers(ArrayList<User> users) { this.FriendList = users; }
}
答案 0 :(得分:4)
当您致电snapshot.getValue(User.class)
时,无法自动注入快照的密钥。
但您可以轻松添加一个额外的调用,将键添加到User
对象。您首先需要为id
类添加User
的getter和setter:
@Exclude
public String getId() { return id; }
@Exclude
public void setId(String id) { this.id = id; }
您可能已经注意到我使用@Exclude
注释了这些内容。这告诉数据库客户端在读取/写入数据库时忽略属性。如果没有注释,您还会在数据库中的每个用户节点中获得id
属性。
现在,您只需在阅读属性值时设置并获取密钥:
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
user.setId(snapshot.getKey());
System.out.println(user.getId());
}
}
在上面的代码段snapshot.getValue(User.class)
中获取包含所有常规属性的用户对象,然后user.setId(snapshot.getKey())
将该键添加到该对象。
写回数据库时,您还可以使用user.getId()
来确定写入位置:
ref.child(user.getId()).setValue(user);