Android:从 Firebase 数据库中检索特定用户的数据 [英] Android: Retrieve data of a specific user from a Firebase database
问题描述
我正在尝试从我的 firebase
实时数据库中读取特定"数据.我见过从表中获取所有数据并通过它查找所需数据记录的示例,但这绝对不是推荐的安全做法.
以下是我保存数据的方式
private void saveInDatabase(String email){//向数据库写入消息FirebaseDatabase 数据库 = FirebaseDatabase.getInstance();DatabaseReference myRef = database.getReference("user");String key = myRef.push().getKey();用户用户 = 新用户();user.setCountry("美国");user.setEmail(email);user.setFirstName("约翰");user.setLastName("Doh");user.setGender("男");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 种不同的方式获取数据,请在下面查看.
----No 1----
private void getUserData(){DatabaseReference 参考 = FirebaseDatabase.getInstance().getReference("user");reference.orderByChild("email").equalTo(FirebaseAuth.getInstance().getCurrentUser().getEmail()).addListenerForSingleValueEvent(new ValueEventListener() {@覆盖public void onDataChange(DataSnapshot dataSnapshot) {for(DataSnapshot 数据:dataSnapshot.getChildren()){String familyname=datas.child("familyName").getValue().toString();}}@覆盖public void onCancelled(DatabaseError databaseError) {}});}
----没有 2----
private void getUserData(){FirebaseUser 用户=FirebaseAuth.getInstance().getCurrentUser();String userid=user.getUid();DatabaseReference 参考 = FirebaseDatabase.getInstance().getReference("user");reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {@覆盖public void onDataChange(DataSnapshot dataSnapshot) {String email = dataSnapshot.getValue(User.class).getEmail();String firstName = dataSnapshot.getValue(User.class).getFirstName();Log.d("数据快照",email+" "+firstName);}@覆盖public void onCancelled(DatabaseError databaseError) {}});}
----没有 3----
private void getUserData() {FirebaseDatabase 数据库 = FirebaseDatabase.getInstance();DatabaseReference myRef = database.getReference("user");查询特定用户 = myRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid());specific_user.addListenerForSingleValueEvent(新的价值事件监听器(){@覆盖public void onDataChange(DataSnapshot dataSnapshot) {//这里你会得到数据String email = dataSnapshot.getValue(User.class).getEmail();String firstName = dataSnapshot.getValue(User.class).getFirstName();Log.d("Datasnapshot", email + " " + firstName);}@覆盖public void onCancelled(DatabaseError databaseError) {}});}
这是我得到的错误.根据我使用的代码集,Null 指针触发的地方不同,正常行为.
rebaseauth D/NetworkSecurityConfig:未指定网络安全配置,使用平台默认值04-25 11:49:46.340 31202-31271/com.example.yohan.firebaseauth V/FA:不活动,与服务断开连接04-25 11:49:47.793 31202-32166/com.example.yohan.firebaseauth W/PersistentConnection:pc_0 - 使用未指定的索引.考虑将 '".indexOn": "email"' at user 添加到您的安全和 Firebase 数据库规则中以获得更好的性能04-25 11:49:47.794 31202-31202/com.example.yohan.firebaseauth D/AndroidRuntime:关闭虚拟机04-25 11:49:47.794 31202-31202/com.example.yohan.firebaseauth E/AndroidRuntime:致命异常:主要进程:com.example.yohan.firebaseauth,PID:31202java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法java.lang.String java.lang.Object.toString()"在 com.example.yohan.firebaseauth.MainActivity$6.onDataChange(MainActivity.java:249)在 com.google.firebase.database.Query$1.onDataChange(来源不明)在 com.google.android.gms.internal.zzbmz.zza(来源不明)在 com.google.android.gms.internal.zzbnz.zzYj(来源不明)在 com.google.android.gms.internal.zzboc$1.run(来源不明)在 android.os.Handler.handleCallback(Handler.java:751)在 android.os.Handler.dispatchMessage(Handler.java:95)在 android.os.Looper.loop(Looper.java:154)在 android.app.ActivityThread.main(ActivityThread.java:6682)在 java.lang.reflect.Method.invoke(Native Method)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
需要做的查询:
<块引用>orderByChild("FirstName").equalTo(name);
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");reference.orderByChild("firstName").equalTo(name).addListenerForSingleValueEvent(new ValueEventListener() {@覆盖public void onDataChange(DataSnapshot dataSnapshot) {for(DataSnapshot 数据:dataSnapshot.getChildren()){String familyname=datas.child("familyName").getValue().toString();}}@覆盖public void onCancelled(DatabaseError databaseError) {}});
假设你有这个数据库:
用户随机编号姓名:约翰familyName: familyName_here
<小时>
另一种方法是使用用户 ID 来检索数据,但正如我在问题中看到的,您使用 push()
保存随机 ID.
您需要检索用户 ID:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();String userid=user.getUid();
然后将其添加到数据库中:
myRef.child(userid).setValue(user);
然后只检索约翰的数据:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();String userid=user.getUid();DatabaseReference 参考 = FirebaseDatabase.getInstance().getReference("user");reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {..}
I am trying to read "specific" data from my firebase
realtime database. I have seen examples of getting all data from a table and going through it to find the data record you want, but that is definitly not a recommended safe practice.
Below is how I save my data
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);
}
Well that works great. But now I need to retrieve the data record from the user
table, that is only belong to John
. If I do this with MySQL, it will be smething like select * from user where primaryKey =JOHN_PRYMARY_KEY
I gave it a try, check below.
database.getReference("user" + FirebaseAuth.getInstance().getCurrentUser().getUid());
I am really not sure how I can proceed from here, I see no method to go forward. Please advice.
UPDATE
I tried the answers from peter haddad and others. When I try to get the data from DataSnapshot, it throws a NullPointerException. The OnDataChanged is getting fired. Below is my database.
I tried to get data in 3 different ways, check below.
----No 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) {
}
});
}
----No 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) {
}
});
}
----No 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) {
}
});
}
This is the error I get. Based on the codeset I use, the place where the Null pointer trigger get different, the normal behavior.
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)
You need to do the query:
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) {
}
});
Assuming you have this database:
user
randomid
firstName: John
familyName: familyName_here
Another way is to use the userid to be able to retrieve the data, but as I see in the question you are saving a random id using push()
.
You need to retrieve the userid:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
then add it to the database:
myRef.child(userid).setValue(user);
then to retrieve data only for John:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");
reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {..}
这篇关于Android:从 Firebase 数据库中检索特定用户的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!