Пользователи базы данных Firebase знают, что для прослушивания присутствуют два основных прослушивателя Data: ValueEventListener и ChildEventListener. Он отлично работает, когда мы слушаем один объект, но становится довольно сложно, когда мы слушаем какую-то коллекцию.
Чтобы задать вопрос, представьте, что у нас есть канал HackerNews, и мы слушаем, например. Объект "posts" в Firebase.
Конечно, у нас есть RecyclerView в нашем приложении для показа сообщений, и я думаю, что хорошая идея будет использовать FirebaseUI, но проблема в том, что мы хотим сделать более абстрактное приложение в случае изменения серверной части или тестов. Поэтому мы будем использовать некоторые адаптеры, но это еще один question.
У нас есть два слушателя, о которых я упоминал, вопрос , который лучше?
Когда мы используем ValueEventListener, мы получим целую коллекцию, но в случае каких-либо изменений, например, один пользователь изменил содержимое сообщения, нам придется перезагрузить целые данные, что означает больше отправки байтов через дорогостоящую передачу сети. Другая проблема заключается в том, что мы пользовательские мультилисты, и вот пример:
-
Post имеет userId, но мы хотим отобразить его имя, поэтому в
onDataChanged
методе мы получаем пользовательские данные, например:postsReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot data : dataSnapshot.getChildren()) { Post post = data.getValue(Post.class); usersReference.child(post.getUserId()).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Here we have user data } @Override public void onCancelled(FirebaseError firebaseError) { } }); } } @Override public void onCancelled(FirebaseError firebaseError) { } });
Вы можете видеть, что теперь мы должны добавить каждое сообщение в RecyclerView отдельно, что даст нам понять, что, возможно, нам следует использовать ChildEventListener.
Итак, теперь, когда мы используем ChildEventListener, проблема одна и та же: мы должны добавлять каждое сообщение в RecyclerView отдельно, но когда кто-то меняет содержимое сообщения, firebase отправляет нам только этот пост, что означает меньше данных через сеть.
Нам не нравится добавлять запись в RecyclerView, потому что, например: - Трудно добавить индикатор загрузки, потому что мы не знаем, когда все данные поступают. - Пользователи получают постоянно обновляемый вид, в то время как новые сообщения идут, а целые списки становятся видимыми. - Трудно сортировать эту коллекцию, мы должны сделать это, возможно, в адаптере.
Вопрос
Каковы наилучшие методы использования firebase с коллекцией и, возможно, лучшие решения, чем я писал выше?
ИЗМЕНИТЬ
Схема данных будет выглядеть так:
"posts" : {
"123456" : {
"createdAt" : 1478696885622,
"content" : "This is post content",
"title" : "This is post title",
"userId" : "abc"
},
"789012" : {
"createdAt" : 1478696885622,
"content" : "This is post content 2",
"title" : "This is post title 2",
"userId" : "efg"
}
}
"users" : {
"abc" : {
"name" : "username1"
},
"efg" : {
"name" : "username2"
}
}
РЕДАКТИРОВАТЬ 2
Я допустил одну ошибку → Firebase не извлекает целые данные в ValueEventListener, когда что-то изменилось. Он получает только "дельта", здесь является доказательством.