首页 文章

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

提问于
浏览
8

CONTEXT

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

demo of structure

图像中的UUID是用户各自的身份验证 . 这是通过以下方式实现的:

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

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

问题

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

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

ref.child(users).child(targetUID)

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

2 回答

  • 2

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

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

    现在您可以使用setter设置用户的UID .

    EDIT : 我正在思考这些问题

    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);
        }
    
  • 4

    我用两种方法来解决这个问题 . 一个是拥有额外的字段,因此具有冗余,另一个是使用HashMap将用户的POJO映射到它的UID .

    如果你注意到每当你从Firebase数据库加载数据时,主要是以Map的形式,所以我所做的只是将密钥保存到Map,后者使用该密钥映射用户的POJO . 该 Map 存储在一个单独的地方,因此可以从应用程序的任何位置访问它 .

    像这样的东西 -

    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即可获得用户 . 我希望这回答了你的问题 .

相关问题