【发布时间】: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