如何将用户 UID 存储在 firebase 数据库中并将其映射到 POJO

How to store a users UID in a firebase database and have it map to a POJO

上下文

我目前正在开发一个 Firebase 应用程序(在 Android)。我已经设置了身份验证、存储和数据库,没有任何问题可言。由于 Firebase auth 用户只有几个属性,我创建了一个 "user" POJO 来存储 Firebase auth 用户中不包含的其他用户信息(即名字、出生日期、国籍等)。 .).其结构如下图所示:

图中的UUID是用户各自的auth uid。这是这样实现的:

ref.child(users).child(auth.getUid()).setValue(user);

这种方法似乎与文档一致,因为它允许我使用 auth.uid === $uid 规则将 write/read 限制为帐户所有者。此外,树内的所有属性都按预期映射到我的 POJO。

问题

我的一个大问题是我想将用户 uid 存储在 POJO 中。由于 UID 当前被构造为对象父对象,我不确定如何将它映射到用户 POJO。我当然可以在底部树级别存储一个附加字段。但是,这似乎是毫无意义的数据冗余。

问题

将 uid 映射到相应 "user" POJO class 的最佳方法是什么。理想情况下,我能够获取 10 个用户进行显示,当一个用户被点击时,应用程序会加载一个配置文件 activity。这意味着传递用户的 uid,所以我可以说:

ref.child(users).child(targetUID)

并获取点击的用户帐户。这意味着拥有他们的 uid。

我在使用FirebaseRecyclerAdapter时遇到了同样的问题,所以我复制了代码并添加了以下方法,因为适配器存储了快照。

public String getItemKey(int position) {
    return mSnapshots.getItem(position).getKey();
}

现在您可以使用 setter.

设置用户的 UID

编辑: 我在想这些事情

User.java

public class User {

    private String name;
    private String email;
    private String UID;

    public User() {
    }

    public String getUID() {
    return UID;
    }

    public void setUID(String UID) {
    this.UID = UID;
    }

    public String getEmail() {
    return email;
    }

    public void setEmail(String email) {
    this.email = email;
    }

    public String getName() {
    return name;
    }

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

并且在您的 Firebase 适配器中 populateView()

String UID;

FirebaseListAdapter<User> searchAdapter = new FirebaseListAdapter<User>(getActivity(), User.class, R.layout.user_layout, mRef) {
        @Override
        protected void populateView(View v, User model, int position) {
            // If you really need to set the UID here              
            // model.setUID = getRef(position).getKey();
            // Otherwise, I would just set a String field as shown 
            //and pass it with the intent to get the UID 
            //in the profile Activity
            UID = getRef(position).getKey
            ((TextView) v.findViewById(R.id.text1)).setText(model.getName());
            ((TextView) v.findViewById(R.id.text2)).setText(model.getEmail());
                v.setOnClickListener(MainActivity.this);
        }
    };
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, ProfileActivity.class);
        intent.putStringExtra(UID_EXTRA, UID);
        startActivity(intent);
    }

我用了两种方法来解决这个问题。一种是拥有额外的字段,从而具有冗余,另一种是使用 HashMap 将用户的 POJO 与其 UID 映射。

如果您注意到每当您从 Firebase 数据库加载数据时,大部分数据都是以地图的形式出现,那么我所做的就是将键保存到地图,它使用该键映射用户的POJO。该地图存储在一个单例中,因此可以从应用程序的任何地方访问它。

像这样 -

DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference("users"); //Add your filter as your requirements. I am currently loading all the users.
mFirebaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Map<String, Map> map = (Map<String, Map>) dataSnapshot.getValue();
        if (map != null) {
        for (String uid : map.keySet()) {//keys will be uid
            Map<String, Map> userMap = map.get(uid); //userMap is a single user's data.
            User user = new User(userMap); //I have used a constructor to map the populate the properties of the User Model.
            getSingletonMap().push(uid,user); //pushing using the uid
        }
    }
}

这样我就可以通过使用 UID ( getSingletonMap().get(uid) ) 或者 get the uid of a user 来获取用户。我希望这能回答你的问题。