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

Jac*_*ton 9 java mapping android firebase firebase-realtime-database

CONTEXT

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

结构演示

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

ref.child(users).child(auth.getUid()).setValue(user);
Run Code Online (Sandbox Code Playgroud)

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

问题

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

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

ref.child(users).child(targetUID)
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*hna 4

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

public String getItemKey(int position) {
    return mSnapshots.getItem(position).getKey();
}
Run Code Online (Sandbox Code Playgroud)

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

编辑: 我在想一些类似的事情

用户.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的 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);
    }
Run Code Online (Sandbox Code Playgroud)