如何防止onDataChange()在Firebase中多次运行

我有一个应用程序,该应用程序在首次运行时会创建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) {

    }
});
dominick86814082 回答:如何防止onDataChange()在Firebase中多次运行

如果只想一次监听数据库中的值,请使用addListenerForSingleValueEvent

类似这样:

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

不过,您可能要考虑允许数据库中包含多个FCM令牌,因为用户可以轻松地同时/大约同时在多个设备上处于活动状态,并且您可能想通知所有这些设备,以最大程度地发挥它们的作用。会得到通知。

一种管理用户所有设备的方法是通过FCM device group

本文链接:https://www.f2er.com/3138012.html

大家都在问