小编Jef*_*ett的帖子

除非禁用脱机持久性,否则Firestore会对大型集合进行慢查询

我正在使用Firestore Recycler Adapter绑定到firestore中的大型集合的查询.

据我了解GitHub中的文档,Firestore Recycler Adapter使用.addSnapshotListener(),而不是.get()方法.

该系列有5,000个文件,其中我将限制为100个.

Query query = fsDB.collection("Users").document(user_id).collection("posts")
.orderBy("date_created).orderBy("topic").limit(100);
Run Code Online (Sandbox Code Playgroud)

现在,当我连接到Internet并且启用了脱机持久性时,此查询在调用onDataChanged()之前平均需要90秒.我认为这是因为回收者从设备上的内存或缓存中获取数据,然后在从网络获取数据之前对其进行排序(!).

因为,当禁用脱机持久性时,查询只需要2-3秒.

如何在启用脱机持久性的同时更快地使用此查询?或者是否有一种方法可以使侦听器在搜索内存/缓存之前访问网络索引?

就像是...

FirestoreRecyclerOptions<Reed> options = new FirestoreRecyclerOptions.Builder<>()
.setQuery(query, Reed.class)
.setFirst(FirebaseFirestore.getInstance fsDB);
Run Code Online (Sandbox Code Playgroud)

客户端的firestore索引不可用吗?

使用firestore 15.0.0,Android设备

android firebase google-cloud-firestore

4
推荐指数
1
解决办法
1525
查看次数

如何加快此Firestore查询循环的性能?将电话联系人列表与Firestore数据库进行比较以进行匹配

我正在将用户手机中的联系人电子邮件列表与我的Firestore数据库中的用户电子邮件列表进行比较,然后创建新的"contactsInApp"列表.

首先,我从firestore数据库中获取整个用户集合.然后,对于每个用户,我创建一个forEach循环,检查我的电话联系人列表中的每个联系人是否匹配.如果匹配,则会创建一个新的"androidContactsInApp"列表.当有少量用户时它可以正常工作,但是当我用5,000个用户测试时,它需要更长的时间 - 大约30秒.我认为firestore应该很好地扩展,所以想知道我的代码是否有问题.

这是我的代码:

fsDB.collection("users")
                .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {
                for (DocumentSnapshot document : documentSnapshots) {

                    String userEmail = document.get("email").toString();

                    for (UserInfoForRequest android_contact: arrayListAndroidContacts) {
                        String isEmailInDatabase = android_contact.getUserEmail();
                        String trimmedEmail = isEmailInDatabase.trim();
                        if (userEmail.equals(trimmedEmail)) {
                            String userID = document.getId();


                            UserInfoForRequest android_contact2 = new UserInfoForRequest();
                            android_contact2.setUserName(document.get("username").toString());
                            android_contact2.setUserEmail(userEmail);
                            android_contact2.setCurrentUID(currentUID);
                            android_contact2.setContactsUID(userID);
                            arrayListAndroidContactsInApp.add(android_contact2);

                        }


                    }

                }
                adapterWithApp.notifyDataSetChanged();
                adapterNoApp.notifyDataSetChanged();
            }
        });
Run Code Online (Sandbox Code Playgroud)

我也试过反转循环.这样做,我在我的电话联系人列表中获得每个联系人,并且我为每个电话联系人执行查询.这意味着我没有下载整个用户集合.这种方法要慢很多 - 慢得多.我认为这是因为我执行单独的个别查询.这是我的代码:

        for (final UserInfoForRequest android_contact: arrayListAndroidContacts) {

            String contactsEmail = android_contact.getUserEmail();
            String trimmedEmail = contactsEmail.trim();

            fsDB.collection("users").whereEqualTo("email", …
Run Code Online (Sandbox Code Playgroud)

performance loops contacts google-cloud-firestore

3
推荐指数
1
解决办法
900
查看次数

Firestore-如何跟踪读取和写入操作的数量

我注意到,Firestore Billing基于存储的数据,下载的数据以及读写操作的数量。

有没有一种方法可以查看正在调用的读取或写入操作的数量,希望可以按日进行跟踪?

据我所知,在“计费”部分中,它仅告诉我我要支付的读取操作的数量-但我对此没有任何详细信息。谢谢。

android google-cloud-firestore

1
推荐指数
1
解决办法
955
查看次数

不一致 - "用于调用Google Play Developer API的项目ID尚未在Google Play开发者控制台中关联."

所以这就是事情 - 我的Android应用程序有一个node.js后端服务器.我正在使用Google Play结算库,并使用后端验证购买是否为Google文档推荐.

现在,有关此错误的所有其他答案似乎都是指一致的问题.

我的后端SOMETIMES验证,有时会将此作为错误返回,表明我的服务帐户实际上是链接的(如我的控制台中所示).

我尝试了两个不同的库,我有同样的问题.有时一个人会回复验证成功,而另一个人会说我的帐户没有关联.有时他们都是消极的,有时都是积极的.

这似乎不一致.

var platform = 'google';
        var payment = {
            receipt: purchaseToken, // always required  ... this is google play purchaseToken
            productId: subID,  // my subscription sku id
            packageName: 'com.xxxxxx', // my package name
            keyObject: key,  // my JSON file
            subscription: true, // optional, if google play subscription

        };



   var promise2 = iap.verifyPayment(platform, payment, function (error, response) {
        /* your code */
        if (error) {
            console.log('error with iap, ' , error);
            return true;
        } …
Run Code Online (Sandbox Code Playgroud)

node.js google-iap

1
推荐指数
1
解决办法
1287
查看次数