【问题标题】:Android: Retrieve data of a specific user from a Firebase databaseAndroid:从 Firebase 数据库中检索特定用户的数据
【发布时间】:2018-10-04 14:12:43
【问题描述】:

我正在尝试从我的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());

我真的不确定如何从这里开始,我看不到任何前进的方法。请指教。

更新

我尝试了 peter haddad 和其他人的答案。当我尝试从 DataSnapshot 获取数据时,它会抛出 NullPointerException。 OnDataChanged 被解雇了。下面是我的数据库。

我尝试通过 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)

【问题讨论】:

  • 看看my answer关于将用户链接到他们在firebase中的数据。
  • @yoAlex5 这些参考适用于 Cloud Firestore,而 OP 使用的是 Firebase 实时数据库。有关从那里阅读的简单示例,请参阅firebase.google.com/docs/database/android/…
  • @FrankvanPuffelen 谢谢。评论已删除

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


【解决方案1】:

您需要进行查询:

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

另一种方法是使用用户 ID 来检索数据,但正如我在问题中看到的那样,您正在使用 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() {..}

【讨论】:

  • 谢谢,但您不是下载整个数据表吗?
  • 请检查编辑,不,你可以做DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user").child(userid);然后它只会获取当前登录用户的数据,在这种情况下是约翰
  • 谢谢。我现在要检查。
  • 如果答案对您有帮助,请点赞并标记为正确,谢谢!
  • @Ravi.Dudi 如果你有 userId 你不必循环,但在这个问题中,OP 有一个随机 id 并且没有它的值,这就是我添加 for 循环的原因跨度>
【解决方案2】:
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) {    
                                           }
                           });

【讨论】:

  • 当我尝试从 DataSnapshot 获取数据时,它会抛出 NullPointerException。 OnDataChanged 被解雇了。
  • 您能否添加日志和代码,您是如何尝试从 dataSnapshot 中获取数据的?
  • 我用代码、截图等进行了编辑,请检查
【解决方案3】:

你必须收集从 firebase 到 somePOJO 类的响应

点击链接:https://firebase.google.com/docs/database/admin/retrieve-data

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

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多