Я работаю с приложением, использующим Firebase в качестве хранилища данных. Я просто реорганизую все свое приложение для реализации «Чистой архитектуры» и RxJava. Выполняя все таким образом, я обнаружил проблему управления объектами модели.Несколько классов модели для того же элемента firebase
Вот моя проблема: у меня есть Post.class с теми же полями и значениями, которые я могу извлечь из Firebase ссылки базы данных:
public Post(Author author, String full_url, String full_storage_uri, String thumb_url, String thumb_storage_uri, String text, Object timestamp) {
this.author = author;
this.full_url = full_url;
this.text = text;
this.timestamp = timestamp;
this.thumb_storage_uri = thumb_storage_uri;
this.thumb_url = thumb_url;
this.full_storage_uri = full_storage_uri;
}
Все хорошо сейчас. Моя проблема появляется, когда я получить данные от моего наблюдателя в моем хранилище класса:
@Override
public Observable<List<Post>> getPosts(final String groupId){
return Observable.fromAsync(new Action1<AsyncEmitter<List<Post>>>() {
@Override
public void call(final AsyncEmitter<List<Post>> listAsyncEmitter) {
final ValueEventListener PostListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
final List<Post> postList = new ArrayList<>();
Log.e("Count ", "" + snapshot.getChildrenCount());
//For every child, create a Post object
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
Post post = postSnapshot.getValue(Post.class);
Log.e("new post added ", postSnapshot.getKey());
//Set the databaseReference to the object, which is needed later
post.setRef(postSnapshot.getKey());
postList.add(post);
}
listAsyncEmitter.onNext(postList);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("The read failed: ", databaseError.getMessage());
}
};
//Remove listener when unsuscribe
listAsyncEmitter.setCancellation(new AsyncEmitter.Cancellable() {
@Override
public void cancel() throws Exception {
getPostsRef().child(groupId).removeEventListener(PostListener);
}
});
//Set the listener
getPostsRef().child(groupId).addValueEventListener(PostListener);
}
}, AsyncEmitter.BackpressureMode.BUFFER);
}
С этим наблюдателем я уже управлять всем слушателям и вызовы данных, моя единственная проблема состоит в эти строки:
//Set the databaseReference to the object, which is needed later
post.setRef(postSnapshot.getKey());
Я думаю, что это не очень хорошая практика, чтобы установить ссылку в качестве нового поля в модели Post, которая должна соответствовать моей базе Json Tree. Поэтому мой вопрос: хорошая ли практика создания двух разных моделей? Один вроде «dbPost» и «PostEntity». Один с значениями firebase, а другой с построителем из dbPost и новыми полями, которые я хочу сохранить (dbReference и, возможно, valueListener)?
Надеюсь, что кто-то может дать мне руку! Я пытаюсь улучшить как можно больше в архитектуре и передовой практике для создания лучших и более гибких приложений, поэтому я задаю такие вопросы!
Удачного дня!
не вы просто установка 'key',' String' как новое поле? 'postSnapshot.getRef()' является 'ссылкой'. Я что-то упускаю? –
Да, но мне нужно использовать ссылку, где я вызываю свой Observer.Subscribe в совершенно другом классе, и я получаю список сообщений. И в этом списке мне нужно сохранить Ref от каждого из них. –
Но зачем wrap' ValueEventListener 'с потоком' Observable'? В любом случае вам придется ждать Callbacks. –