改进Firestore离线缓存 - Android

时间:2018-02-15 12:20:19

标签: android firebase kotlin google-cloud-firestore offline-caching

因此,我的应用程序的一半依赖于Firestore。

有时,加载文档需要很长时间,例如5000ms或更多。如果它是图像或其他东西也许我会理解,但它主要是字符串或Ints ......

关于如何改进这一点的任何想法?

由于

修改     db.collection(" usersAuth / $ {FirebaseAuth.getInstance()。uid !!} / KitLists")。get()。addOnSuccessListener {snapshot - >

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

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

       mainListViewAdapter.notifyDataSetChanged()
    }

EDIT2

所以,我改编了它,但我在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()
        }
    })

这是错误snapshot error

1 个答案:

答案 0 :(得分:2)

如果您使用get()请求,则需要知道您正在尝试通过互联网读取数据。您无法将此与尝试读取SQLite数据库进行比较,该数据库本地存储在磁盘上。从Firebase服务器获取数据的速度取决于您的Internet连接速度以及您尝试获取的数据量。因此,等待5000ms的原因很可能就是其中之一。如果原因是大量数据,请尝试优化您的查询或尝试将数据分成小部分。

如果我们说的是第一次尝试阅读文档,它可能比后续文件更慢,因为它必须启动互联网连接。我知道Firebase团队正在尝试提高性能,但在通过网络检索数据时,您不能指望0ms

您可以做的一件事是启用offline persistence,这将为之前读取的数据创建本地chache。但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);
    }
});