Как обновлять локальный объект с помощью базы данных Firebase - PullRequest
1 голос
/ 25 апреля 2019

Я новичок в 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();
        }
    });

Здесь callback является объектом моего собственного класса обратного вызова.

Я пытаюсь понять, как постоянно обновлять сущность.

есть ли способ сохранить ссылку на созданный мной объект сущности и обновить ее при обновлении объекта в базе данных, используя addValueEventListner, чтобы она отражалась во всем приложении? Я понимаю, что в представлении переработчика данные обновляются автоматически. Мой вопрос не касается случая с переработчиком.

если есть такой способ, то как бы я справился с ситуацией, когда разные фрагменты кода создают разные клиентские объекты для одного и того же объекта базы данных? Есть ли способ применения одного объекта на объект базы данных в клиенте?

Надеюсь, мои вопросы не расплывчаты.

РЕДАКТ. 1:

На основе комментария добавлена ​​минималистичная структура базы данных. Есть больше структур, таких как «сообщения», которые являются сложными (содержит список и т. Д.).

screenshot of database

РЕДАКТИРОВАТЬ 2:

Я понимаю, что addValueEventListner будет запускать метод onDataChange для каждого обновления в базе данных. Мой вопрос заключается в том, как поддерживать локальный объект в актуальном состоянии и как применять один локальный объект для каждого объекта базы данных в клиенте. Пожалуйста, прочитайте оригинальный вопрос для более подробной информации.

1 Ответ

0 голосов
/ 25 апреля 2019

Используйте

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());
        // ...
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...