2016-07-05 18 views
8

A User jest zdefiniowany jako:Grupa użytkowników w Firebase

public class User { 
    private String email; 
    private String uid; 
    private List<Group> groups; 

    public User(String email, String uid) { 
    this.email = email; 
    this.uid = uid; 
    this.groups = new ArrayList<>(); 
    } 

    public User() {} 

    public User(String email, String uid, ArrayList<Group> groups) { 
    this.email = email; 
    this.uid = uid; 
    this.groups = groups; 
    } 

    public String getEmail() { 
    return email; 
    } 

    public String getUid() { 
    return uid; 
    } 

    public List<Group> getGroups() { 
    return groups; 
    } 

    public void addGroup(Group group) { 
    if (this.groups == null) { 
     this.groups = new ArrayList<>(); 
    } 
    this.groups.add(group); 
    } 
} 

Group jest zdefiniowany jako:

public class Group { 
    private List<User> memberList; 

    private Group() { 
    } 

    public Group(List<User> users) { 
    this.memberList = users; 
    } 

    public void addMember(User member) { 
    this.memberList.add(member); 
    } 

    public List<User> getMemberList() { 
    return memberList; 
    } 
} 

Przy próbie zapisania do Firebase, daje to błąd runtime:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/JsonMappingException 
                      at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:611) 

Czy problem jest związany z odwołaniami cyklicznymi, czy baza danych Firebase nie może przechowywać danych w ten sposób?

Odpowiedz

6

Tak, myślę, że problem dotyczy okólnika. Tam, gdzie występuje odwołanie do Circular, zawsze jest problem z serializacją.

Jak widać, masz dwukierunkowe relacje między użytkownikami i grupami. Według official documentation można poprawić strukturę jak:

{ 
    "users": { 
    "user1": { 
     "name": "User 1", 
     "groups": { 
     "group1": true, 
     "group2": true, 
     "group3": true 
     }, 
    "user2": { 
     "name": "User 2", 
     "groups": { 
     "group2": true, 
     "group3": true 
     } 
    }, 
    ... 
    }, 
    "groups": { 
    "group1": { 
     "name": "Group 1", 
     "members": { 
     "user1": true 
     }, 
    "group2": { 
     "name": "Group 2", 
     "members": { 
     "user1": true, 
     "user2": true 
     }, 
    "group3": { 
     "name": "Group 3", 
     "members": { 
     "user1": true, 
     "user2": true 
     } 
    }, 
    ... 
    } 
} 
+0

zamiast używać podejścia opartego logiczną byłoby dopuszczalne wykorzystanie kolekcji ciąg na grupy/użytkowników obiektów, aby wskazać ich członkostwa? To może wydawać się szalone, jeśli grupy osiągnęły poziom 1000+ – JamieB

+0

@Chintan Jestem nowicjuszem w Firebase. Taką strukturę zarządzałem. Jak mogę zapytać o pobranie wszystkich grup, które mają członka "user1"? Zazwyczaj pytam w ten sposób: Zapytanie mQuery = mFirebaseDbRef.child ("groups"); – Kalpesh

Powiązane problemy