将userId保存在模型Firebase上

Ant*_*sta 2 android firebase firebase-realtime-database

我有一个与如何使用Firebase保存用户信息有关的问题。我扩展了用户身份验证,并在json树上为用户创建了一个新节点,每个用户都有由firebase生成的自己的ID,并且用户信息位于该键/ 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;
                    }


                }
Run Code Online (Sandbox Code Playgroud)

我将用户信息映射到代码中具有的用户模型中的键中,但是在我的项目的下一步中,我也需要具有特定用户的键。在这里,我只是映射没有密钥的用户信息。有没有一种方法可以在模型中添加字符串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; }
    }
Run Code Online (Sandbox Code Playgroud)

Fra*_*len 5

调用时无法获取自动插入的快照的密钥snapshot.getValue(User.class)

但是您可以轻松地添加一个额外的调用,以将密钥添加到User对象。首先,您需要添加一个getter和setter为id你的User类:

@Exclude
public String getId() { return id; }
@Exclude
public void setId(String id) { this.id = id; }
Run Code Online (Sandbox Code Playgroud)

如您可能已经注意到的,我用注释了这些@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码段中,snapshot.getValue(User.class)获取具有所有常规属性的用户对象,然后user.setId(snapshot.getKey())将密钥添加到该对象。

回写数据库时,您还可以user.getId()用来确定写入位置:

ref.child(user.getId()).setValue(user);
Run Code Online (Sandbox Code Playgroud)