从多个文档中读取数据时,会多次触发Firestore事务

时间:2018-04-21 22:21:49

标签: java android firebase google-cloud-firestore

我正在使用Firestore Transaction来读取多个文档数据。我之前使用事务来编写多个文档并且它工作正常但是当我尝试读取数据时,事务函数多次调用自身,最后它告诉我OnFailureListener上的事务超时。我已经附上了下面的代码,如果有人告诉我这里的问题会很棒。

private void getFireBaseData(final String userType, String typeID) {
        final DocumentReference profileRef = fireStoreDb.collection("users").document(AppValues.userId);
        final DocumentReference aboutMeRef = fireStoreDb.collection(AppValues.userId).document("aboutMe");

        final DocumentReference typeRef = fireStoreDb.collection(AppValues.userType + "s").document(typeID);

        fireStoreDb.runTransaction(new Transaction.Function<Void>() {
            @Nullable
            @Override
            public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
                Log.e(TAG, "Transaction started!");
                    DocumentSnapshot profileSnapshot = transaction.get(profileRef);
                    DocumentSnapshot aboutMeSnapshot = transaction.get(aboutMeRef);
                    DocumentSnapshot typeSnapshot = transaction.get(typeRef);

                    AppValues.profile = profileSnapshot.toObject(Profile.class);
                    AppValues.aboutMeDetails = aboutMeSnapshot.toObject(AboutMeDetails.class);

                    if (userType.equals("helper")) {
                        AppValues.helper = typeSnapshot.toObject(Helper.class);
                    } else if (userType.equals("needer")) {
                        AppValues.needer = typeSnapshot.toObject(Needer.class);
                    }

                    callNavigationActivity();
                    Log.e(TAG, "Transaction success!");

                return null;
            }

        }).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // callNavigationActivity();
                Log.e(TAG, "Transaction success complete!");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG, "Transaction Failure! " + e.getMessage());
            }
        });

1 个答案:

答案 0 :(得分:0)

如果您打算对您阅读的所有文档进行更改,则只应使用交易。此外,您可以预期事务处理程序可能会多次运行。来自documentation

  

事务由任意数量的get()操作组成   任意数量的写操作,如set(),update()或delete()。   在并发编辑的情况下,Cloud Firestore运行整个   再次交易。例如,如果事务读取文档和   另一个客户端修改任何这些文档,Cloud Firestore   重试交易。此功能可确保交易   运行最新且一致的数据。

(你也隐藏了callNavigationActivity()背后的一些功能。这可能是它自己的问题。好像你可能不想在事务中那样做。)

如果您不需要更新您阅读的文件,请不要使用交易。