【问题标题】:How to prevent onDataChange() run multiple time in Firebase如何防止 onDataChange() 在 Firebase 中多次运行
【发布时间】:2020-03-05 01:55:08
【问题描述】:

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

    }
});

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-cloud-messaging


    【解决方案1】:

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

    比如:

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

    您可能需要考虑在数据库中允许多个 FCM 令牌,因为用户可以轻松地同时/大约同时在多个设备上处于活动状态,并且您可能希望在所有设备上通知他们以最大化他们所做的更改会收到通知的。

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

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2012-11-29
      • 1970-01-01
      • 2015-02-10
      • 2014-08-08
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多