2016-10-19 1 views
2

Я работаю с приложением, использующим 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)?

Надеюсь, что кто-то может дать мне руку! Я пытаюсь улучшить как можно больше в архитектуре и передовой практике для создания лучших и более гибких приложений, поэтому я задаю такие вопросы!

Удачного дня!

+0

не вы просто установка 'key',' String' как новое поле? 'postSnapshot.getRef()' является 'ссылкой'. Я что-то упускаю? –

+0

Да, но мне нужно использовать ссылку, где я вызываю свой Observer.Subscribe в совершенно другом классе, и я получаю список сообщений. И в этом списке мне нужно сохранить Ref от каждого из них. –

+0

Но зачем wrap' ValueEventListener 'с потоком' Observable'? В любом случае вам придется ждать Callbacks. –

ответ

1

И наконец, я создал два разных класса модели. Один из них, чтобы извлечь и вставить свои Params базы данных из Firebase и другой используется мое приложение для управления данными с дополнительными значениями, что нужно думали применение:

App модель:

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 Модель:

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 
} 

[...]

Смежные вопросы