【问题标题】:Retrieve realtime database values inside Firestore在 Firestore 中检索实时数据库值
【发布时间】:2020-12-17 02:48:27
【问题描述】:

其实我想显示用户在线/离线状态。我阅读了https://firebase.google.com/docs/firestore/solutions/presence 并实施了onDiscount() 以更新实时数据库isOnline = false 打折,但问题是当用户打折时这些数据不会在Firestore 内更新。

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


     Map<String, Object> user = new HashMap<>();


        myRef.child(IS_ONLINE).setValue(true);
        myRef.child(IS_ONLINE).onDisconnect().setValue(false);

        myRef.child("isOnline").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                status = snapshot.getValue(Boolean.class);
                user.put("isOnline", status);
                doctRef.set(user);

            }

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

            }
        });


}

【问题讨论】:

  • 问题解决了吗?
  • 不是!实际上,为了从实时检索数据到firestore,我使用了后台服务,但问题是在哪里调用这些服务。如果我在onDestroy() 中调用这些服务,那么它们将无法工作.. :(

标签: firebase firebase-realtime-database google-cloud-firestore


【解决方案1】:

我创建了一个服务来调用这个方法,你可以这样尝试。一旦应用真正从后台移除,该服务就会触发。

public class ClosingService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        // Handle application closing
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child(getString(R.string.USER));
        FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        if (firebaseUser != null) { databaseReference.child(firebaseUser.getUid()).child(getString(R.string.sedang_online)).setValue(false);
        databaseReference.child(firebaseUser.getUid()).child(getString(R.string.lastSeen)).setValue(System.currentTimeMillis());
    }
    // Destroy the service
    stopSelf();
}
}

之后,应用程序启动时会调用此服务。例如,在 Splashscreen 活动中。

    //Start closing service
    final Intent stickyService = new Intent(this, ClosingService.class);
    startService(stickyService);

别忘了在 androidmanifest 中创建服务。

   <service
        android:name=".u.ClosingService"
        android:stopWithTask="false" />

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 2021-12-29
  • 2020-12-18
  • 2021-09-05
  • 2022-01-08
  • 2021-10-26
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多