如何将用户 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 来获取用户。我希望这能回答你的问题。
上下文
我目前正在开发一个 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 来获取用户。我希望这能回答你的问题。