改进Firestore离线缓存-Android

改进Firestore离线缓存-Android,android,firebase,kotlin,google-cloud-firestore,offline-caching,Android,Firebase,Kotlin,Google Cloud Firestore,Offline Caching,因此,我的应用程序有一半相当依赖Firestore 有时,加载文档需要相当长的时间,例如5000ms或更长时间。如果是图像或其他东西,我可能会理解,但主要是字符串或整数 关于如何改进这一点,有什么想法吗 谢谢 编辑: db.collection(“usersAuth/${FirebaseAuth.getInstance().uid!!}/KitLists”).get().addOnSuccessListener{snapshot-> for (document in snaps

因此,我的应用程序有一半相当依赖Firestore

有时,加载文档需要相当长的时间,例如
5000ms
或更长时间。如果是图像或其他东西,我可能会理解,但主要是字符串或整数

关于如何改进这一点,有什么想法吗

谢谢


编辑: 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()
    }

编辑2

因此,我修改了它,但在
快照上有一个未解决的错误

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()
        }
    })
db.collection(“usersAuth/${FirebaseAuth.getInstance().uid!!}/KitLists”).addSnapshotListener(对象:EventListener{
重写fun OneEvent(@Nullable值:QuerySnapshot,@Nullable e:FirebaseFirestoreException?){
如果(e!=null){
Log.w(“标记”,“侦听失败”,e)
返回
}
for(snapshot.documents中的文档){
val数据=文件
val kitName=data.id
firstKitList.add(kitName)
}
mainListViewAdapter.notifyDataSetChanged()
}
})

如果您使用的是
get(),这就是错误
request,您需要知道您正在尝试通过internet读取数据。您无法将此与atempt进行比较,以读取本地存储在磁盘上的SQLite数据库。从Firebase服务器获取数据的速度取决于您的internet连接速度和试图获取的数据量。因此,大多数情况下等待
5000ms
的原因可能就是其中之一。如果原因是数据量太大,请尝试优化查询或尝试以小部分方式获取数据

如果我们说的是第一次读取文档,它可能比后续的要慢,因为它必须启动internet连接。我知道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);
    }
});
yourDocumentReference.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable DocumentSnapshot snapshot,@Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
返回;
}
if(snapshot!=null&&snapshot.exists()){
Log.d(标记“当前数据:”+snapshot.getData());
}否则{
Log.d(标记“当前数据:null”);
}
}
});
如果要侦听集合中的多个文档,请使用以下代码:

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);
    }
});
yourCollectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable QuerySnapshot值,@Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
返回;
}
List cities=new ArrayList();
用于(文档快照文档:值){
if(doc.get(“name”)!=null){
cities.add(doc.getString(“name”);
}
}
Log.d(标签“CA当前cites:+城市”);
}
});

如果您使用的是
get()
request,您需要知道您正在尝试通过internet读取数据。您无法将此与atempt进行比较,以读取本地存储在磁盘上的SQLite数据库。从Firebase服务器获取数据的速度取决于您的internet连接速度和试图获取的数据量。因此,大多数情况下等待
5000ms
的原因可能就是其中之一。如果原因是数据量太大,请尝试优化查询或尝试以小部分方式获取数据

如果我们说的是第一次读取文档,它可能比后续的要慢,因为它必须启动internet连接。我知道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);
    }
});
yourDocumentReference.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable DocumentSnapshot snapshot,@Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
返回;
}
if(snapshot!=null&&snapshot.exists()){
Log.d(标记“当前数据:”+snapshot.getData());
}否则{
Log.d(标记“当前数据:null”);
}
}
});
如果要侦听集合中的多个文档,请使用以下代码:

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);
    }
});
yourCollectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable QuerySnapshot值,@Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.w(标记“侦听失败”,e);
返回;
}
List cities=new ArrayList();
用于(文档快照文档:值){
if(doc.get(“name”)!=null){
cit