Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:从Firebase数据库检索特定用户的数据_Java_Android_Firebase_Firebase Realtime Database_Firebase Authentication - Fatal编程技术网

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

Java Android:从Firebase数据库检索特定用户的数据,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我正在尝试从我的firebase实时数据库中读取“特定”数据。我见过从一个表中获取所有数据并通过它查找所需数据记录的示例,但这绝对不是推荐的安全做法 下面是我如何保存数据的 private void saveInDatabase(String email) { // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance();

我正在尝试从我的
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做这件事,它会像从用户那里选择*primaryKey=JOHN\u PRYMARY\u KEY

我试了一下,看看下面

database.getReference("user" + FirebaseAuth.getInstance().getCurrentUser().getUid());
我真的不知道如何从这里开始,我看不到任何前进的方法。请给我一些建议

更新


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

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

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

----二号----

----三号----

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

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)

您需要执行以下查询:

假设您拥有此数据库:

user
  randomid
     firstName: John
     familyName: familyName_here
 myRef.child(userid).setValue(user);

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

您需要检索用户ID:

FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
然后将其添加到数据库:

user
  randomid
     firstName: John
     familyName: familyName_here
 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() {..}

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

以下链接:


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

谢谢,但是您不是下载了整个数据表吗?请检查编辑,不,您可以只执行
DatabaseReference=FirebaseDatabase.getInstance().getReference(“用户”).child(userid)然后它将只获取当前登录用户的数据,在本例中,该用户是John谢谢。我现在要检查一下。如果答案对你有帮助,请投上一票并标记为正确,谢谢@Ravi.Dudi如果你有
用户id
,你就不必循环,但在这个问题中OP有一个随机id,没有它的值,这就是为什么我为循环添加了一个,看看如何在firebase中将用户链接到他们的数据。@yoAlex5这些参考用于Cloud Firestore,而OP使用的是firebase实时数据库。要从这里阅读一个简单的例子,请参阅@FrankvanPuffelen谢谢。注释被删除当我试图从DataSnapshot获取数据时,它抛出一个NullPointerException。OnDataChanged正在被解雇。你能添加日志和代码吗?你是如何尝试从dataSnapshot获取数据的?我用代码、屏幕截图等进行了编辑。请检查
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) {    
                                           }
                           });
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {..}
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) {    
                                           }
                           });