Как обновлять локальный объект с помощью базы данных firebase

#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»