2016-06-05 4 views
1

Firebase DB에 데이터가 있습니다. 데이터의 비 직렬화를 시도 할 때까지 모든 것이 올바르게 작동합니다.영역이있는 Firebase. POJO 클래스 비 직렬화

오류 :

@RealmClass 
public class Playlist extends RealmObject { 

String name; 
Long id; 
RealmList<Track> tracks; 
Integer count; 
String createdBy; 
RealmList<UserMap> myMap; 
String qrKey; 

public RealmList<UserMap> getMyMap() { 
    return myMap; 
} 

public void setMyMap(RealmList<UserMap> myMap) { 
    this.myMap = myMap; 
} 

public Playlist(){} 



public String getQrKey() { 
    return qrKey; 
} 

public void setQrKey(String qrKey) { 
    this.qrKey = qrKey; 
} 

public String getCreatedBy() { 
    return createdBy; 
} 

public void setCreatedBy(String createdBy) { 
    this.createdBy = createdBy; 
} 


public RealmList<Track> getTracks() { 
    return tracks; 
} 

public void setTracks(RealmList<Track> tracks) { 
    this.tracks = tracks; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public Integer getCount() { 
    return count; 
} 

public void setCount(Integer count) { 
    this.count = count; 
} 
: 이것은 내 POJO 클래스는

DatabaseReference root = FirebaseDatabase.getInstance(). 
       getReferenceFromUrl("https://swing-8792d.firebaseio.com/playlist"); 
     Query playlistQuery = root.orderByKey().equalTo(key); 
     playlistQuery.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 

        Log.d("Child", child + ""); 

        Playlist receivedPlaylist = child.getValue(Playlist.class); 
        Playlist playlist = new Playlist(); 

        playlist.setCreatedBy(receivedPlaylist.getCreatedBy()); 
        playlist.setName(receivedPlaylist.getName()); 
        playlist.setMyMap(receivedPlaylist.getMyMap()); 
        playlist.setQrKey(receivedPlaylist.getQrKey()); 
        playlist.setCount(receivedPlaylist.getCount()); 
        playlist.setId(receivedPlaylist.getId()); 
        playlist.setTracks(receivedPlaylist.getTracks()); 
        mPlaylist.add(playlist); 
} 

입니다 : 인수 1 io.realm.RealmList을 입력 있으며, 여기에 내 코드입니다 인 java.util.ArrayList

있어요

}

노멀로 직렬화를 시도하면 POJO 클래스 (즉, 영역 제거)는 정상적으로 작동합니다.

답변

4

default 생성자 또는 개인 변수가없는 클래스, 즉 공개 getter/setter가없는 클래스에서는 Firebase가 작동하지 않습니다.

더 쉬운 해결책은 RealmObject를 확장하지 않는 동일한 pojo 인 미들웨어 클래스를 만드는 것입니다. 그런 다음 pojo 값을 사용하여 RealmObject 하위 클래스를 초기화합니다.

코드

class SimplePojoPlaylist { 
    public String variable; 
} 

class Playlist extends RealmObject { 
    public String variable; 
} 

는 먼저 SimplePojoPlaylist

for (DataSnapshot child : dataSnapshot.getChildren()) { 
     SimplePojoPlaylist receivedPlaylist = child.getValue(SimplePojoPlaylist.class); 
     Playlist playList = new Playlist(); 
     playList.variable = receivedPlaylist.variable; 
    } 
+0

제 게터와 세터를 제거합니까? –

+0

당신은 그들을 지킬 수 있습니다. 나는 대답을 짧게 지키기 위해 그들을 사용하지 않았다. – Shubhank

+0

한 가지 문제는 내 재생 목록에 RealmList가 있지만 SimplePojoList에 Arraylist가있는 것입니다. 어떻게 처리해야합니까? –

1

RealmList에 던져 의사 A는, 직렬화 복원 유형을 지원하지 않습니다. 데이터베이스는 구조를 검사하고 트랙을 ArrayList로 추론합니다. 그런 다음 변환하려고하면 형식이 일치하지 않는 것으로 나타납니다.

Check this link from the docs:

또한, 원치 않는 액세스 및/또는 수정을 방지하는 불변의 개체를 만들 수있는 좋은 방법입니다.

빈 개체를 처음부터 만든 다음 상태를 정의하기 위해 setter 메서드를 호출하는 것은 매우 좋은 패턴이 아닙니다. 상태가 "broken"되기 전에 개체에 액세스하는 상황을 만들 수 있기 때문입니다.

유연한 객체, 몇 개의 필수 필드 및 선택 사항이 필요한 객체를 작성해야하는 경우 Builder 패턴을 사용하는 것이 좋지만 모델을 다시 설계해야합니다.

wikipedia - Builder

당신이 /가 필요하지 않은 경우

이 빌더를 사용하려면, 내 조언은 다음과 같습니다

1) 빈 생성자는 비공개로하고 모든 필드를 필요로 다른 공용 만듭니다.

2) 트랙 필드를 "목록"유형으로 변경하십시오. 그런 다음 RealmList를 반환하는 객체가 필요하면 RealAsist를 멤버 목록에서 제외하고 반환하는 tracksAsRealmList()와 같은 다른 getter 메서드를 만듭니다.

3) "트랙"모델에는 비공개 생성자가 있고, 모든 매개 변수가있는 공용 모델과 모든 필드가 firebase 비 직렬화에 의해 지원되는지 확인하십시오.

4) 엄격히 필요한 경우가 아니라면 개체 필드를 비공개로 설정하고 setter 메서드를 통해 값을 설정하십시오.

이 정보가 도움이되기를 바랍니다.

관련 문제