代码之家  ›  专栏  ›  技术社区  ›  PeakGen

Android:从Firebase数据库检索特定用户的数据

  •  5
  • PeakGen  · 技术社区  · 6 年前

    我正在尝试从我的 firebase 实时数据库。我看到过从表中获取所有数据并遍历它以找到所需数据记录的示例,但这肯定不是推荐的安全做法。

    下面是我如何保存数据

    private void saveInDatabase(String email)
        {
            // Write a message to the database
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("user");
            String key = myRef.push().getKey();
    
            User user = new User();
            user.setCountry("United States");
            user.setEmail(email);
            user.setFirstName("John");
            user.setLastName("Doh");
            user.setGender("Male");
    
            myRef.child(key).setValue(user);
    
        }
    

    那很好用。但现在我需要从 user 表,该表仅属于 John .如果我用MySQL做这件事 select * from user where primaryKey =JOHN_PRYMARY_KEY

    我试了一下,看看下面。

    database.getReference("user" + FirebaseAuth.getInstance().getCurrentUser().getUid());
    

    我真的不知道如何从这里开始,我看不到前进的方法。请给出建议。

    使现代化

    我试着从 彼得·哈达德 和其他人。当我尝试从DataSnapshot获取数据时,它抛出一个NullPointerException。OnDataChanged被解雇了。下面是我的数据库。

    enter image description here

    我试着用3种不同的方式获取数据,请查看下面的内容。

    ----1号----

    private void getUserData()
        {
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
    
            reference.orderByChild("email").equalTo(FirebaseAuth.getInstance().getCurrentUser().getEmail()).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot datas: dataSnapshot.getChildren()){
                        String familyname=datas.child("familyName").getValue().toString();
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
        }
    

    ----2号----

    private void getUserData()
    {
        FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
        String userid=user.getUid();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
        reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String email = dataSnapshot.getValue(User.class).getEmail();
                String firstName = dataSnapshot.getValue(User.class).getFirstName();
                Log.d("Datasnapshot",email+" "+firstName);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    }
    

    ----3号----

    private void getUserData() {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("user");
    
        Query specific_user = myRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        specific_user.addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //here you will get the data
                        String email = dataSnapshot.getValue(User.class).getEmail();
                        String firstName = dataSnapshot.getValue(User.class).getFirstName();
                        Log.d("Datasnapshot", email + " " + firstName);
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
    
    
                    }
                });
    }
    

    这就是我得到的错误。根据我使用的代码集,空指针触发器的位置不同,这是正常的行为。

    rebaseauth D/NetworkSecurityConfig: No Network Security Config specified, using platform default
    04-25 11:49:46.340 31202-31271/com.example.yohan.firebaseauth V/FA: Inactivity, disconnecting from the service
    04-25 11:49:47.793 31202-32166/com.example.yohan.firebaseauth W/PersistentConnection: pc_0 - Using an unspecified index. Consider adding '".indexOn": "email"' at user to your security and Firebase Database rules for better performance
    04-25 11:49:47.794 31202-31202/com.example.yohan.firebaseauth D/AndroidRuntime: Shutting down VM
    04-25 11:49:47.794 31202-31202/com.example.yohan.firebaseauth E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.yohan.firebaseauth, PID: 31202
                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                                                                                        at com.example.yohan.firebaseauth.MainActivity$6.onDataChange(MainActivity.java:249)
                                                                                        at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
                                                                                        at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                                        at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                                        at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                                        at android.os.Handler.handleCallback(Handler.java:751)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:6682)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
    
    3 回复  |  直到 6 年前
        1
  •  10
  •   Peter Haddad    6 年前

    您需要执行以下查询:

    orderByChild("FirstName").equalTo(name);
    
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
    
    reference.orderByChild("firstName").equalTo(name).addListenerForSingleValueEvent(new ValueEventListener() {
     @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot datas: dataSnapshot.getChildren()){
       String familyname=datas.child("familyName").getValue().toString();
        }
     }
       @Override
    public void onCancelled(DatabaseError databaseError) {
      }
     });
    

    假设您有此数据库:

    user
      randomid
         firstName: John
         familyName: familyName_here
    

    另一种方法是使用userid来检索数据,但正如我在问题中看到的,您正在使用 push()

    您需要检索用户ID:

    FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
    String userid=user.getUid();
    

    然后将其添加到数据库:

     myRef.child(userid).setValue(user);
    

    然后仅为John检索数据:

    FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
    String userid=user.getUid();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
    reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {..}
    
        2
  •  1
  •   Levon Petrosyan    6 年前
    Query specific_user = myRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
          specific_user.addListenerForSingleValueEvent(
                  new ValueEventListener() {
                  @Override
                  public void onDataChange(DataSnapshot dataSnapshot) {
                         //here you will get the data
                      }
    
                  @Override
                  public void onCancelled(DatabaseError databaseError) {    
                                               }
                               });
    
        3
  •  0
  •   Ritesh    6 年前

    您必须收集firebase对somePOJO类的响应

    关注链接: https://firebase.google.com/docs/database/admin/retrieve-data

    正如您在onDataChange()中所看到的,响应是在Post中收集的。类,它是POJO类。