2017-05-14 106 views
0

我试图检查在用户中登录的用户是否是Firebase数据库中JSON数组的授权用户。如何从Firebase获取电子邮件字段的价值? ?无法从Firebase数据库获取数组值

这是模型User类:

public class User { 

    ArrayList<User> email; 

    public User() {} 

    public ArrayList<User> getEmail() { 
     return email; 
    } 

    public void setEmail(ArrayList<User> email) { 
     this.email = email; 
    } 
} 

对于从userslist获得email,我用此逻辑。

usersListDatabaseReference.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         User userEmail = dataSnapshot.getValue(User.class); 
         ArrayList<String> userEmailFromDatabase = userEmail.getEmail(); 
         Log.d(TAG, "User email from Database: "+userEmailFromDatabase); 
         Log.d(TAG, "Logged in User email: " + user.getEmail()); 
        } 

但是,当我尝试从数据库中获取电子邮件时,出现以下异常和应用程序崩溃。

com.google.firebase.database.DatabaseException: Can't convert object of type java.util.ArrayList to type com.apvolution.amapp.model.User 

如何获得一个“电子邮件from the userslist field ? How do I loop through the entire usersList`?

这是我的Firebase控制台中的数据库结构。

amapp-731b2addclose 
    + messages 
    + version 
    - userslist 
     - email 
     | 
     | -- 0: "[email protected]" 
     | -- 1: "[email protected]" 
     | -- 2: "[email protected]" 
     | -- 3: "[email protected]" 

logcat的细节:

05 - 13 21: 59: 37.418 16387 - 16387/com.apvolution.bcm E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.apvolution.bcm, PID: 16387 
com.google.firebase.database.DatabaseException: Can 't convert object of type java.lang.String to type com.apvolution.amapp.model.User 
at com.google.android.gms.internal.zzbtg.zze(Unknown Source) 
at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) 
at com.apvolution.bcm.MainActivity$3.onDataChange(MainActivity.java: 260) 
at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
at com.google.android.gms.internal.zzbqx.zzZT(Unknown Source) 
at com.google.android.gms.internal.zzbra$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: 6123) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 867) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 757) 

回答

1

的probem是您要存储你的数据在ArrayListMap代替。更改Map<String, Object> map = new HashMap<>();中的类型并解决您的问题。

为了让你的数据了从dataSnapshot对象,请使用此代码:

DatabaseReference yourRef = FirebaseDatabase.getInstance().getReference().child("userslist").child("email"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String firstEmail = (String) dataSnapshot.child("0").getValue(); 
     String secondEmail = (String) dataSnapshot.child("1").getValue(); 
     String thirdEmail = (String) dataSnapshot.child("3").getValue(); 
     String fourthEmail = (String) dataSnapshot.child("4").getValue(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
yourRef.addListenerForSingleValueEvent(eventListener); 

希望它能帮助。

+0

我现在将我的模型类'User'更改为此。我是否使用GenericTypeIndicator来从Firebase存储中提取数据? – Chip

+0

完美。保持我的发布。 –

+0

'Map email = new HashMap <>(); 用户(){ } public Map getEmail(){ return email; '这就是我现在用于'User'模型的东西。是对的吗 ? – Chip

0

似乎DataSnapshotgetValue(GenericTypeIndicator)要求您提交List<YourCustomModel>而不仅仅是YourCustomModel,看到this link from Firebase docs。这意味着你应该这样做:

GenericTypeIndicator<List<User>> t = new GenericTypeIndicator<List<User>>() {}; 
List<User> userEmail = dataSnapshot.getValue(t); 

然后,从那里,单独检索每封电子邮件。您可能要重新检查你怎么做你的用户模型,虽然,因为它可能不需要它自己的ArrayList<>

+0

欣赏它!现在我得到这个'无法转换java.lang.String类型的对象来键入com.apvolution.amapp.model.User' – Chip

+0

无论如何用堆栈跟踪或更新您的帖子更新? – Mercato

+0

我认为你应该将你的用户模型代码中的ArrayList 更改为ArrayList 。这可能会解决它 – Mercato