组织firebase数据

时间:2017-09-19 20:10:58

标签: java firebase firebase-realtime-database firebase-authentication

我正在使用Firebase Auth和Firebase数据库来存储学生的个人资料和学生报告。

当用户注册时,他们输入电子邮件,密码,学校名称,学年,学校纪律。我使用Auth的电子邮件和密码,但其余信息存储在具有唯一ID的数据库中,如下所示:

enter image description here

对于报告,每个学生可以输入许多条目,每个条目都有其唯一ID,如下所示:

enter image description here

以下是我的问题:

  1. 学生登录后,如何找到他们的个人资料信息,因为父母是一个唯一的ID。换句话说,有没有办法在数据库中搜索该学生的电子邮件(例如,图像中的mido4@hotmail.com)并从中获取学生姓名(在本例中为Emina Osman)?

  2. 获得学生姓名后,如何搜索学生在数据库中保存的所有条目?对于学生的每个条目,学生姓名都会保存。

  3. 不确定我设置数据库的方式是否理想,有更好的方法吗?

  4. 感谢您的时间!任何帮助将非常感激!

2 个答案:

答案 0 :(得分:1)

  1. 是的,确实如此。实现这一目标的最简单方法是稍微改变您的数据库结构。因此,不是使用push()方法生成的推送键作为唯一标识符,而是使用电子邮件地址。它也很独特,易于使用。这样做的好处是,您可以在数据库中搜索该特定电子邮件。您的数据库结构应如下所示:

    flashscreen-1d252
         |
         --- Users
               |
               --- mido4@hotmail,com
               |      |
               |      --- //User Details
               |  
               --- mido5@hotmail,com
                      |
                      --- //User Details
    
  2. 请注意,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

    1. 您必须在电子邮件地址之后搜索,而不是在名称之后搜索。
    2. 上面已经回答过。这种数据库结构更有效。
    3. 修改:根据使用电子邮件地址与uid的关于此答案的其他2个问题。

      1. 如果用户决定删除其帐户并在一段时间后决定返回并尝试再次登录,该怎么办?如果我们使用email address,则不会发生任何事情。如果我们使用uid,当用户第二次登录时,会生成另一个uid,这显然与第一个不同,这就是您遇到麻烦的时刻,因为即使他是同一个用户,他也被视为新用户。

      2. 如果用户的电子邮件地址发生变化怎么办?恕我直言,只有当您决定更改电子邮件时,才能更改电子邮件。就个人而言,我多年来没有改变我的电子邮件地址,但我已从数百个应用程序中删除了数百个帐户。即使您更改了电子邮件地址,也没有太大问题。您登录您的应用程序,更改电子邮件地址及其相关信息。您还将拥有该应用程序中的所有历史记录。拥有唯一标识符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的报告。

  

不确定我设置数据库的方式是否理想,所以有更好的方法   方式是什么?

有许多不同的方法可以达到你想要的效果,但上面是一种非常常见的设计模式。