Как предотвратить onDataChange () запускаться несколько раз в Firebase - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть приложение, которое создает токен FCM, когда приложение запускается в первый раз, после чего токен сохраняется в базе данных firebase под номером мобильного телефона.

Процедура сохранения данных в базе данных состоит в том, чтобы сначала получитьданные из базы данных, а затем в onDataChange() он должен обновить данные, если он уже выходит, в противном случае данные создаются заново.

Теперь проблема заключается в следующем: когда я открываю приложение, используя номер мобильного телефона «1234» ив маркере базы данных против этого, скажем, «1». Теперь, если я открою приложение на другом мобильном телефоне, используя тот же номер, т. Е. «1234», токен на другом устройстве, скажем, «2». В базе данных токен с номером 1234 должен обновиться с «1» до «2», но этого не происходит. Фактически, когда данные обновляются до 2, затем снова они преобразуются в 1, затем снова 2, затем 1, затем снова 2 и т. Д.

Я хочу, если для номера мобильного телефона генерируется новый токен, то он должен быть обновлен.

Это мой код:

tokenZ = new Token();
SharedPreferences sharedPreferenceZ =activity.getSharedPreferences(cmn.SHARED_SPNAME,MODE_PRIVATE);
final String tokens = sharedPreferenceZ.getString(cmn.RegistrationTokenforFirebase, "1");
final DatabaseReference database = FirebaseDatabase.getInstance().getReference();
final DatabaseReference databaseChild = FirebaseDatabase.getInstance().getReference().child("" + UserID);

database.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Map<String, Object> oldData = (Map<String, Object>) dataSnapshot.getValue();

        if (oldData != null) {
            System.out.println("oldDD" + oldData.get(UserID));
            System.out.println("oldDDy" + "{token=" + tokens + "}");

            if (oldData.get(UserID) != null) {
                System.out.println("Number already");


                Map<String, Object> currentData = (Map<String, Object>) oldData.get(UserID);

                if (oldData.get(UserID).toString().equals("{token=" + tokens + "}")) {
                    System.out.println("Token already");
                    currentData.put("token", tokens);
                    databaseChild.updateChildren(currentData);
                } else {
                    System.out.println("New Token");
                    //  databaseChild.removeValue();
                    tokenZ.setToken(tokens);
                    databaseChild.setValue(tokenZ);
                    FirebaseMessaging.getInstance().setAutoInitEnabled(false);

                }
            } else {
                System.out.println("New Number");
                tokenZ.setToken(tokens);
                databaseChild.setValue(tokenZ);
            }
        } else {
            tokenZ.setToken(tokens);
            databaseChild.setValue(tokenZ);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

1 Ответ

0 голосов
/ 08 ноября 2019

Если вы хотите прослушивать значение в базе данных только один раз, используйте addListenerForSingleValueEvent.

Так что-то вроде:

database.addListenerForSingleValueEvent(new ValueEventListener() {
  ...

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

Одним из способов управления всеми устройствами для пользователя является использование группы устройств FCM .

.
...