2016-10-19 16 views
2

私は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)です。

誰かが私に手を差し伸べることを願っています!私がこのような質問をしている理由は、より良い、より柔軟なアプリケーションを構築するためのアーキテクチャーと良いプラクティスを可能な限り向上させることです。

良い一日を!

+0

はあなただけの設定ではないです'key'、新しいフィールドとして' String'ですか? 'postSnapshot.getRef()'は 'Reference'です。何か不足していますか? –

+0

はい、私はObserser.Subscribeを全く別のクラスで呼び出す参照を使用する必要があり、投稿のリストを受け取っています。そのリストでは、それぞれのRefを保持する必要があります –

+0

なぜValueEventListener '観測可能なストリームで?とにかくコールバックを待たなければなりません。 –

答えて

1

最後に、私は2つの異なるモデルクラスを作成しました。

アプリケーションモデル::

public class Post implements Parcelable{ 
private Author author; 
private String full_url; 
private String thumb_storage_uri; 
private String thumb_url; 
private String text; 
private Object timestamp; 
private String full_storage_uri; 
private String ref; 
private Achivement post_achivement; 
private long post_puntuation; 

public Post() { 
    // empty default constructor, necessary for Firebase to be able to deserialize blog posts 
} 
[......] 

取得し、Firebase、それは必要な余分な値を持つデータを管理するために、私のアプリが使用する別のものから私のデータベースのparamsを挿入するそのうちの一つは、アプリケーションを考えましたFirebaseモデル:

public class NetworkPost { 
private Author author; 
private String full_url; 
private String thumb_storage_uri; 
private String thumb_url; 
private String text; 
private Object timestamp; 
private String full_storage_uri; 
private Achivement post_achivement; 
private long post_puntuation; 

public NetworkPost() { 
    // empty default constructor, necessary for Firebase to be able to deserialize blog posts 
} 

[...]

関連する問題