在模型Firebase上保存userId

时间:2017-04-30 11:27:56

标签: android firebase firebase-realtime-database

我有一个与如何使用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; }
    }

1 个答案:

答案 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);