私はFirebaseをデータリポジトリとして使用していたアプリケーションで作業しています。私は、Clean ArchitectureとRxJavaを実装するために私のアプリケーション全体をリファクタリングしています。このようにすべてを実行すると、モデルオブジェクトを管理する際に問題が発生しました。ここで同じ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;
}
すべて:私はFirebaseデータベースの参照から取得することができ、同じフィールドと値をPost.classを持っています。私は私のリポジトリのクラスで私のオブザーバーからデータを取得するときに私の問題が表示されます。
//Set the databaseReference to the object, which is needed later
post.setRef(postSnapshot.getKey());
:私はすでに、すべてのリスナーとのデータコールを管理このオブザーバで
@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);
}
、私の唯一の問題は、これらの行であります私は、ポストモデルの新しいフィールドとしてリファレンスを設定するのは良い方法ではないと思います。これは、Firebase Json Treeと同じにする必要があります。だから私の質問です:2つの異なるモデルを作成するための良い練習ですか? 1つは "dbPost"と "PostEntity"のようです。 1つはfirebaseの値を持ち、もう1つはdbPostのビルダーと、保存したい新しいフィールド(dbReferenceとおそらくvalueListener)です。
誰かが私に手を差し伸べることを願っています!私がこのような質問をしている理由は、より良い、より柔軟なアプリケーションを構築するためのアーキテクチャーと良いプラクティスを可能な限り向上させることです。
良い一日を!
はあなただけの設定ではないです'key'、新しいフィールドとして' String'ですか? 'postSnapshot.getRef()'は 'Reference'です。何か不足していますか? –
はい、私はObserser.Subscribeを全く別のクラスで呼び出す参照を使用する必要があり、投稿のリストを受け取っています。そのリストでは、それぞれのRefを保持する必要があります –
なぜValueEventListener '観測可能なストリームで?とにかくコールバックを待たなければなりません。 –