Как я могу вызвать уведомление только тогда, когда база данных Firebase изменилась? - PullRequest
0 голосов
/ 31 марта 2019

В качестве заголовка я хочу сделать только, когда база данных изменилась, чем запустить уведомление для нее, но проблема в том, что когда я запускаю приложение, появляется уведомление, даже если данные не меняются, вот мой код:

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v= inflater.inflate(R.layout.main,container,false);

        result= (TextView) v.findViewById(R.id.textView3);


        notificationmanager = NotificationManagerCompat.from(ct.getcontext());
        if (user != null) {

            ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        String post = dataSnapshot.getValue(String.class);
                        result.setText(post);

                        Notification notification = new NotificationCompat.Builder(ct.getcontext(), CHANNEL_1_ID)
                                .setSmallIcon(R.drawable.ic_launcher_foreground)
                                .setContentTitle(post)
                                .setContentText("test")
                                .setPriority(NotificationCompat.PRIORITY_HIGH)
                                .setCategory(NotificationCompat.CATEGORY_EVENT)
                                .setDefaults(Notification.DEFAULT_ALL)
                                .build();
                        notificationmanager.notify(2,notification);



                    }

                }

                @Override
                public void onCancelled(DatabaseError error) {

                }
            });

        }
        else
        {
            Toast.makeText(getActivity(),"not yet login",Toast.LENGTH_LONG).show();
        }


        return v;
    }

Ответы [ 3 ]

1 голос
/ 31 марта 2019

Сохраните значение в своих локальных настройках, затем при следующем изменении проверьте, действительно ли это значение изменилось, сравнив его с ранее сохраненным значением.

0 голосов
/ 31 марта 2019

По объяснению @ mikasaloli, я подозреваю, что проблема заключается скорее в смешении функций RTDB Firebase (базы данных в реальном времени) / Firestore и неправильного прослушивателя.

Первая проблема - RTDB firebase / firestoreпо умолчанию хранит локальную кэш-копию ссылок (не всех), к которым вы обращались на своем телефоне.Из их документов они говорят , и я цитирую: «Асинхронные прослушиватели: данные, хранящиеся в базе данных Firebase Realtime, извлекаются путем подключения асинхронного прослушивателя к ссылке на базу данных. Прослушиватель запускается один раз для начального состоянияданные и снова каждый раз, когда данные изменяются. Слушатель событий может получать несколько различных типов событий . Этот режим извлечения данных поддерживается в Java, Node.js и Python Admin SDK. "Что вам нужно сделать, это обойти локальный кэш при чтении данных в первый раз после запуска приложения. вот как я смог это сделать (с небольшим изменением)

Вторая проблема, как уже упоминалось ранее, addListenerForSingleValueEvent будет вызвана только один раз.Поэтому, если вы получите уведомление об изменении в первый раз, ваш слушатель автоматически отменит свою регистрацию, подразумевая, что вы не будете получать последующие события onDataChange.

Теперь, предположив из предыдущих абзацев, проблема с приведенным выше кодомis: он присоединяет слушателя к событию с одним значениемкоторый затем запускается с локальной (кэшированной) версией данных, которая принудительно не является последним состоянием базы данных сервера (если приложение находилось в автономном режиме, а некоторые изменения произошли в сети).Но затем, при подключении этого слушателя, он запускается с локальной версией данных и впоследствии отменяет регистрацию.Подразумевается, что приведенный выше код будет срабатывать не более одного раза и может никогда не сработать в течение срока его службы при подключении.

Я предлагаю вам обойти локальный кеш и использовать addValueEventListener.

0 голосов
/ 31 марта 2019

Вам необходимо использовать addValueEventListener(), из документов:

public ValueEventListener addValueEventListener (ValueEventListener listener)

Добавить прослушиватель для изменений данных в этом месте.Каждый раз, когда данные изменяются, ваш слушатель будет вызываться с неизменным снимком данных.

При использовании addValueEventListener каждый раз, когда происходит изменение в базе данных, оно будет запускаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...