Android:使用 Firebase 数据库的应用程序访问计数

Pra*_*ani 5 java android firebase firebase-realtime-database

我想在任何用户打开应用程序时计算应用程序访问次数。我已经完成了以下代码,该代码仅在互联网打开时才能成功运行

我曾用于FirebaseDatabase.getInstance().setPersistenceEnabled(true);离线存储数据,也用于myRef.keepSynced(true);保持同步。

这是代码:

    // COUNTER PART
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("counter");
    myRef.keepSynced(true);
    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Log.i("FB", "Snapshot: " + dataSnapshot);
            long val = (long) dataSnapshot.getValue() + 1;
            myRef.setValue(val);
            mainBinding.contentLayout.textViewCounterVisits.setVisibility(View.VISIBLE);
            mainBinding.contentLayout.textViewCounterVisits.setText(getString(R.string.total_visits, val));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.e("FB", "Error: " + error);
        }
    });
Run Code Online (Sandbox Code Playgroud)

问题:

当我多次离线打开应用程序时,它会离线计数。当我打开互联网时,它只是与更新的数据同步,但我想通过添加新计数来更新计数。

例如:

  • 计数为 105

  • App 1 - 打开10次(离线)

  • App 2 - 打开15次(在线)

  • 现在计数为 120

  • 应用程序 1 上线并打开应用程序,计数正在更新 121。

我想如果全部算起来应该是131。

Ale*_*amo 4

我想如果全部算起来应该是131。

如果该机制是真实的,正如您所描述的那样,不,它甚至不应该是121,它应该是116,这是正常行为,因为您对两个应用程序使用相同的计数器。其机制如下:

  • 计数为 105
  • 应用程序 1 - 打开 10 次(离线)-> 计数仍为105
  • 应用程序 2 - 打开 15 次(在线)-> 计数为 120 (105 + 15)

当应用程序 1 处于离线状态时,它只知道初始计数105以及排队的那10 个增加操作。当应用程序 1 上线时,它会占用115,并覆盖当时数据库中现有的120值。现在,数据库中的计数器值为115。当App 1再次打开时,计数器将增加到116

发生这种“策略”行为是因为应用程序 1 在离线时不知道应用程序 2 在在线时正在做什么,反之亦然。一般来说,当涉及到在多用户环境中增加计数器时,这不是您应该采取的方式。在这种情况下,为了获得一致的数据,您应该使用事务,正如我在以下帖子中的回答中所解释的:

但请注意,Firebase 事务不支持离线使用。无法缓存或保存事务以供以后使用。这是因为事务绝对需要与服务器进行往返通信,以确保事务内的代码成功完成。

因此,在我看来,count只有当用户在线并使用事务操作时,才应该增加该字段。

PS 如果您考虑在某个时间点尝试使用Cloud Firestore,您可以找到一个非常有用的增量操作方法,名为FieldValue.increment()


归档时间:

查看次数:

1249 次

最近记录:

5 年,8 月 前