【问题标题】:Firebase FireStore @ Android - best practices for offline firstFirebase FireStore @ Android - 离线优先的最佳实践
【发布时间】:2021-07-15 09:06:34
【问题描述】:

我正在使用 Firebase Firestore(不是实时数据库)并用它编写一个 android 应用程序。

我希望我的应用首先离线工作,这意味着当应用加载时,FireStore 将从 Chace 加载数据并将其显示给用户,然后从服务器更改查询。

为了实现这一点,我正在使用 Chace 的源进行正常的 GET 请求(不是侦听器)。

get 调用完成后,我将附加一个侦听器来侦听所有更新。 (本地或从服务器),所以我可以向用户展示更新的状态。

这种方法的问题在于它基本上意味着我将下载同一个对象两次第一次是在初始获取请求上,然后是在初始侦听器上。这意味着我会将副本发送到 UI。

Firestore API 中是否有任何做法可以避免这种情况?那么监听器不会返回get请求已经同步的记录?

请参见下面的示例代码。谢谢!

GET 请求:(首先运行)

db.collection(sCollection)
                .get(SOURCE.CHACE)
               .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {

                        if (task.isSuccessful()) {

                            for (QueryDocumentSnapshot document : task.getResult()) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                            }
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
            });

监听器:(第二个运行)

m_registration = db.collection(sName).
        orderBy("stamp", Query.Direction.ASCENDING)
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot value,
                                    @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG, "Listen failed.", e);
                        return;
                    }

                    for (DocumentChange dc : value.getDocumentChanges()) {

                        
                            }
                            catch(JSONException ex) {

                            }


                    }

【问题讨论】:

标签: android firebase google-cloud-firestore


【解决方案1】:

Firebase Firestore 对 offline 的处理非常好,您可以将其用作 oofline first 数据库,而无需您自己做任何事情。您可以读取、收听和编辑数据,就像同步进行一样。你一定要检查this

这意味着您不需要使用get 来使offline 更好。它将与listener 无缝协作。

【讨论】:

  • 一般来说,你是对的,监听器知道如何无缝地从检查中获取数据。但是,我在某处读到它首先尝试从服务器获取它,并且只有在超时后才会访问 Chace。这是真的?这会在互联网连接可能不稳定的地方出现问题吗?
  • 如果您没有任何连接,它将直接从缓存中获取数据。如果您想确保从缓存中获取数据,您可以自己直接禁用和启用网络访问:firebase.google.com/docs/firestore/manage-data/…
  • 也可以看看这个:stackoverflow.com/a/50799518/5519300 听者听起来像是一个更好的解决方案。
  • 谢谢!我现在对使用监听器更有信心了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2019-06-07
  • 2021-11-08
相关资源
最近更新 更多