2017-07-24 72 views
0

我有用戶與列表獲取對象從火力上的Android

public class User { 

@SerializedName("username") 
private String userName; 
@SerializedName("email") 
private String email; 
@SerializedName("bags") 
private List<Bag> bags; 
. 
. 
. 

A類和我在我的火力有這個數據DB

enter image description here

之前,我添加了「袋」項目,該對象創建正常,我使用這種方法來檢索用戶的uid:

public void retrieveUserByUid(String uid, FirebaseRetrieveUserListener listener){ 
    Query userQuery = dbReference.child(FirebaseChild.users.name()).child(uid); 

    final FirebaseRetrieveUserListener dataListener = listener; 

    userQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      User user = dataSnapshot.getValue(User.class); 
      dataListener.retrieveUserByUid(user); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

正如我所說,這個工作沒有「袋」項,當我把它,我得到的錯誤是這樣的。

com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap 

發生這種情況時,我嘗試這樣做

User user = dataSnapshot.getValue(User.class); 

我搜索了很多關於如何檢索列表,但我覺得是檢索一個列表對象,而不是一個「混合「帶有」單個數據「的對象和一個列表。

+0

我想手動反序列化是在這種情況下,更好的方法。但是你可能會嘗試使用'HashMap '這個袋子屬性。 –

回答

0

試試這個:

@SerializedName("bags") 
private Map<String,Bag> bags; 
1

正如你錯誤所述,雖然反序列化它預計HashMap而不是List。由於Firebase是NoSQL數據庫,因此Firbease中的所有內容都是按鍵和值組成的。因此,Firebase中的每個節點都是Map。爲了解決這個問題,請將bags從列表更改爲HashMap,您的問題將得到解決。

你也可以試試這個:

GenericTypeIndicator<List<YourClass>> t = new GenericTypeIndicator<List<Message>>() {}; 
List<YourClass> messages = snapshot.getValue(t); 
+0

我試過了,但現在錯誤是這樣的:'類java.util.HashMap具有泛型類型參數,請使用GenericTypeIndicator來代替' – Doruko

+0

請看我更新的答案。 –