#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-база данных в реальном времени
Вопрос:
Я новичок в Android и Java в целом.
Я пытаюсь создать приложение для Android, в котором у меня есть объекты, хранящиеся в базе данных firebase в реальном времени. По требованию я извлекаю объекты из базы данных, используя addListnerForSingleValueEvent.
mDatabase.child(itemType).child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
T entity = dataSnapshot.getValue(typeParameterClass);
callback.onSuccess(entity);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
callback.onFailure();
}
});
Здесь обратный вызов — это объект моего собственного класса обратного вызова.
Я пытаюсь понять, как постоянно обновлять объект.
есть ли способ, которым я могу сохранить ссылку на созданный мной объект entity и обновлять его при обновлении объекта в базе данных с помощью addValueEventListner, чтобы это отражалось во всем приложении? Я понимаю, что в представлении recycler данные обновляются автоматически. Мой вопрос не относится к виду recycler.
если есть такой способ, то как бы я справился с ситуацией, когда разные фрагменты кода создают разные клиентские объекты для одного и того же объекта базы данных? Есть ли способ принудительно использовать один объект для каждого объекта базы данных в клиенте?
Я надеюсь, что мои вопросы не являются расплывчатыми.
РЕДАКТИРОВАТЬ 1:
На основе комментария добавлена минималистичная структура базы данных. Есть и другие структуры, такие как «сообщения», которые являются сложными (содержат список и т.д.).
ПРАВКА 2:
Я понимаю, что addValueEventListner будет запускать метод onDataChange для каждого обновления в базе данных. Мой вопрос заключается в том, как поддерживать локальный объект в актуальном состоянии и как применять один локальный объект для каждого объекта базы данных в клиенте. Пожалуйста, прочитайте исходный вопрос для получения более подробной информации.
Комментарии:
1. можете ли вы показать структуру базы данных?
2. добавлена структура части базы данных, созданной для тестирования в «РЕДАКТИРОВАТЬ 1». Спасибо за помощь.
3. github.com/AtifAbbAsi19/Firebase-Helper/tree/master/app/src проверьте сеть pckg
4. Что вы имеете в виду, говоря «как поддерживать локальный объект в актуальном состоянии и как применять единый локальный объект для каждого объекта базы данных в клиенте».? Пожалуйста, ответьте с помощью @.
Ответ №1:
Используйте
addValueEventListener
вместо
addListenerForSingleValueEvent
Пример:
// My top posts by number of stars
mDatabase.child(itemType).child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
// TODO: handle the post
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
});
Комментарии:
1. Я понимаю, что addValueEventListener будет запускать метод onDataChange для каждого обновления. Вопрос в том, как обновлять локальный объект таким образом, чтобы везде в клиенте, где используется объект, он имел обновленное значение.
2. Два варианта для этого «Livedate» или использование «Observer»