![](/img/trans.png)
[英]How to retrieve the latest data that has been pushed to a child in Firebase?
[英]How to get pushed data out of child in userID child Firebase (Android)?
我的Firebase數據庫有問題。 我想從userID的(child)的child中獲取推送的用戶數據。 請幫助我,並說明如何從唯一用戶的孩子參考中獲取孩子。 我已經可以從userID子級中提取數據,但是我不能再進一步了。 我幾乎在所有地方都在尋找,找不到答案。
提前致謝 :)
規則
{
/* Visit https://firebase.google.com/docs/database/security to learn more
about security rules. */
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
ViewDatabase
package com.mcarrow.mapsservicerunning;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class ViewDatabase extends AppCompatActivity {
private static final String TAG="ViewDatabase";
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private String userID;
private ListView mListView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_database_layout);
mListView =(ListView)findViewById(R.id.listview);
mAuth=FirebaseAuth.getInstance();
mFirebaseDatabase= FirebaseDatabase.getInstance();
myRef=mFirebaseDatabase.getReference();
FirebaseUser user=mAuth.getInstance().getCurrentUser();
userID=user.getUid();
mAuthListener=new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user =firebaseAuth.getInstance().getCurrentUser();
if(user!=null){
Log.d(TAG,"Signed in"+user.getUid());
toastMessage("Signed In"+user.getEmail());
}else {
Log.d(TAG,"Signed Out");
toastMessage("Signed Out");
}
}
};
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
showData(dataSnapshot);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void showData(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
UserInformation uInfo = new UserInformation();
ds= (DataSnapshot) ds.child(userID).getChildren();
uInfo.setName(ds.getValue(UserInformation.class).getName());
uInfo.setEmail(ds.getValue(UserInformation.class).getEmail());
uInfo.setPhone_num(ds.getValue(UserInformation.class).getPhone_num());
Log.d(TAG, "showData: name: " + uInfo.getName());
Log.d(TAG, "showzData: phone_num: " + uInfo.getPhone_num());
Log.d(TAG, "showData: email: " + uInfo.getEmail());
ArrayList<String> array = new ArrayList<>();
array.add(uInfo.getName());
array.add(uInfo.getEmail());
array.add(uInfo.getPhone_num());
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
}
@Override
protected void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
protected void onStop() {
super.onStop();
if(mAuthListener!=null){
mAuth.removeAuthStateListener(mAuthListener);
}
}
private void toastMessage(String message){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
}
用戶信息
package com.mcarrow.mapsservicerunning;
public class UserInformation {
private String Name;
private String Email;
private String Phone_num;
public UserInformation(){
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getPhone_num() {
return Phone_num;
}
public void setPhone_num(String phone_num) {
Phone_num = phone_num;
}
}
logcat的
java.lang.ClassCastException: com.google.firebase.database.zza cannot be cast to com.google.firebase.database.DataSnapshot
at com.mcarrow.mapsservicerunning.ViewDatabase.showData(ViewDatabase.java:73)
at com.mcarrow.mapsservicerunning.ViewDatabase.access$100(ViewDatabase.java:23)
at com.mcarrow.mapsservicerunning.ViewDatabase$2.onDataChange(ViewDatabase.java:58)
at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source:13)
at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
正如我在您的數據庫中看到的那樣,您正在使用一個我個人認為不需要的額外孩子。 為簡單起見,建議您使用以下數據庫結構:
Firebase-root
|
--- users
|
--- uid
|
--- Email: "egor@gmail.com"
|
--- Name: "Egor"
|
--- Phone_num: "24365675"
瞧,現在還沒有這個額外的關卡。 要獲取單個用戶的數據,請使用以下代碼:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserInformation uInfo = dataSnapshot.getValue(UserInformation.class);
Log.d(TAG, uInfo.getName());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
如果要從所有用戶那里獲取數據,請使用以下代碼:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
UserInformation uInfo = ds.getValue(UserInformation.class);
Log.d(TAG, uInfo.getName());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);
代碼中的另一個問題是您正在模型類字段中使用以大寫字母開頭而不是小寫字母的字段。 當您使用名為getName()
的getter時,Firebase會查找名為name
而不是Name
的字段。 參見小寫的n
字母和大寫字母N
嗎? 因此,這可能會給您帶來麻煩。 您的模型類應該是正確的樣子:
public class UserInformation {
private String name, email, phoneNum;
public UserInformation() {}
public UserInformation(String name, String email, String phoneNum) {
this.name = name;
this.email = email;
this.phoneNum = phoneNum;
}
public String getName() { return name; }
public String getEmail() { return email; }
public String getPhoneNum() { return phoneNum; }
}
刪除舊數據,添加新數據,一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.