我正在使用Firebase Auth和Firebase数据库来存储学生的个人资料和学生报告。
当用户注册时,他们输入电子邮件,密码,学校名称,学年,学校纪律。我使用Auth的电子邮件和密码,但其余信息存储在具有唯一ID的数据库中,如下所示:
对于报告,每个学生可以输入许多条目,每个条目都有其唯一ID,如下所示:
以下是我的问题:
学生登录后,如何找到他们的个人资料信息,因为父母是一个唯一的ID。换句话说,有没有办法在数据库中搜索该学生的电子邮件(例如,图像中的mido4@hotmail.com)并从中获取学生姓名(在本例中为Emina Osman)?
获得学生姓名后,如何搜索学生在数据库中保存的所有条目?对于学生的每个条目,学生姓名都会保存。
不确定我设置数据库的方式是否理想,有更好的方法吗?
感谢您的时间!任何帮助将非常感激!
答案 0 :(得分:1)
是的,确实如此。实现这一目标的最简单方法是稍微改变您的数据库结构。因此,不是使用push()
方法生成的推送键作为唯一标识符,而是使用电子邮件地址。它也很独特,易于使用。这样做的好处是,您可以在数据库中搜索该特定电子邮件。您的数据库结构应如下所示:
flashscreen-1d252
|
--- Users
|
--- mido4@hotmail,com
| |
| --- //User Details
|
--- mido5@hotmail,com
|
--- //User Details
请注意,Firebase不允许在密钥中使用.
(点)符号。正如您可能看到的那样,我已使用.
(逗号)更改了,
点。我使用以下方法实现了这一目标:
String encodeUserEmail(String userEmail) {
return userEmail.replace(".", ",");
}
要搜索用户并获取名称,只需在Users
节点上添加一个侦听器,如下所示:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userRef = rootRef.child("Users").child("mido4@hotmail,com");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
String firstName = dataSnapshot.child("firstname").getValue(String.class);
String lastName = dataSnapshot.child("lastname").getValue(String.class);
Log.d("TAG", firstName + " " + lastName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);
输出结果为:Emina Osman
修改:根据使用电子邮件地址与uid的关于此答案的其他2个问题。
如果用户决定删除其帐户并在一段时间后决定返回并尝试再次登录,该怎么办?如果我们使用email address
,则不会发生任何事情。如果我们使用uid
,当用户第二次登录时,会生成另一个uid
,这显然与第一个不同,这就是您遇到麻烦的时刻,因为即使他是同一个用户,他也被视为新用户。
如果用户的电子邮件地址发生变化怎么办?恕我直言,只有当您决定更改电子邮件时,才能更改电子邮件。就个人而言,我多年来没有改变我的电子邮件地址,但我已从数百个应用程序中删除了数百个帐户。即使您更改了电子邮件地址,也没有太大问题。您登录您的应用程序,更改电子邮件地址及其相关信息。您还将拥有该应用程序中的所有历史记录。拥有唯一标识符uid
,如果您删除该帐户并再次返回,则从零开始。
答案 1 :(得分:1)
一旦学生登录,我怎样才能找到他们的个人资料信息 parent是唯一的ID。
超级简单!最初创建用户帐户时,Firebase会为用户分配一个“随机”且不变的用户uid(uid)。那个uid是Firebase特定用户的标识。这就是你应该在用户节点下存储信息的内容,如下所示:
users
uid_0
name: "users name"
然后,当他们将来进行身份验证时,firebase会在身份验证过程中为您提供该uid。然后,您可以通过该uid从用户节点获取其用户信息。即读取节点/ users / uid_0
获得学生姓名后,如何搜索所有学生的姓名 学生已保存在数据库中的条目?
再次,超级简单。对于您在Firebase中创建的每个条目,请参考该uid。例如,假设您要跟踪每个用户报告
reports
uid_0
-9i9sdjj3i0a09djads //create with push() or childByAutoId() in swift
reportName: "some report"
-ua9sd9i9i3i0idsfi
reportName: "another report"
然后要获取所有报告,请阅读node / reports / uid_0
相反,您可以存储报告,然后存储指向用户的链接
reports
-9i9sdjj3i0a09djads
reportName: "some report"
report_by: "uid_0"
并且使用该结构可以进行查询,其中report_by等于“uid_0”以返回所有uid_0的报告。
不确定我设置数据库的方式是否理想,所以有更好的方法 方式是什么?
有许多不同的方法可以达到你想要的效果,但上面是一种非常常见的设计模式。