firebase 改进Firestore离线缓存- Android

rjee0c15  于 2023-01-14  发布在  Android
关注(0)|答案(1)|浏览(118)

因此,我的应用程序有一半相当程度上依赖于Firestore。
有时候,加载文档需要很长时间,比如5000ms或者更长时间。如果是图像或者其他东西,我可能会理解,但是主要是字符串或者整型...
有什么想法我可以改善这一点吗?
谢谢

**编辑:**数据库集合(“用户验证/${FirebaseAuth.getInstance().uid!!}/工具包列表”).get().addOnSuccessListener {快照-〉

for (document in snapshot.documents) {
            val data = document

            val kitName = data.id
            firstKitList.add(kitName)
        }

       mainListViewAdapter.notifyDataSetChanged()
    }

编辑2
所以,我修改了它,但是在snapshot上有一个未解决的错误。

db.collection("usersAuth/${FirebaseAuth.getInstance().uid!!}/KitLists").addSnapshotListener(object : EventListener<QuerySnapshot> {
        override fun onEvent(@Nullable value: QuerySnapshot, @Nullable e: FirebaseFirestoreException?) {
            if (e != null) {
                Log.w("TAG", "Listen failed.", e)
                return
            }

            for (document in snapshot.documents) {
            val data = document

            val kitName = data.id

            firstKitList.add(kitName)

        }

       mainListViewAdapter.notifyDataSetChanged()
        }
    })

这是错误x1c 0d1x

8ftvxx2r

8ftvxx2r1#

如果您正在使用get()调用,您需要知道您正在尝试通过Internet读取数据。您不能将此操作与阅读SQLite数据库的操作进行比较。它存储在本地磁盘上。从Firebase服务器获取数据的速度取决于您的Internet连接速度和您试图获取的数据量。因此,等待5000ms的原因很可能是其中之一,或者两者兼而有之。如果原因是数据量,请尝试优化您的查询或尝试将数据分成小部分。
如果我们说的是第一次尝试读取文档,它可能会比随后的几次慢,因为它必须启动互联网连接。我知道Firebase团队正在尝试提高性能,但当通过网络检索数据时,您不能期望0ms
你可以做的一件事是启用offline persistence,它将为之前读取的数据创建一个本地缓存。但是get()请求将首先检查Firebase服务器。如果你使用addSnapshotListener(),你将能够立即该高速缓存中读取数据,而无需检查网络。
如果要收听单个文档,请使用以下代码:

yourDocumentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, "Current data: " + snapshot.getData());
        } else {
            Log.d(TAG, "Current data: null");
        }
    }
});

如果要收听集合中的多个文档,请使用以下代码:

yourCollectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }

        List<String> cities = new ArrayList<>();
        for (DocumentSnapshot doc : value) {
            if (doc.get("name") != null) {
                cities.add(doc.getString("name"));
            }
        }
        Log.d(TAG, "Current cites in CA: " + cities);
    }
});

相关问题