如何使用Firebase的Fire Firestore离线缓存更新的数据?

时间:2018-04-16 08:22:56

标签: android firebase google-cloud-firestore

我希望没有互联网连接的用户进行的任何数据修改都会被缓存,并在他恢复互联网连接时上传到CloudFirestore Firebase。 这里我的代码应该保存数据更新:

mSaveProfileUpdatesImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseFirestore db = FirebaseFirestore.getInstance();
            final DocumentReference docRef = db.collection("users").document(mFirebaseAuth.getCurrentUser().getUid());
            db.runTransaction(new Transaction.Function<Void>() {
                @Nullable
                @Override
                public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
                    User user = transaction.get(docRef).toObject(User.class);
                    if (mUsernameTextInputLayout.getEditText() != null)
                        user.setUsername(mUsernameTextInputLayout.getEditText().getText().toString());
                    if (mEmailTextInputLayout.getEditText() != null)
                        user.setEmail(mEmailTextInputLayout.getEditText().getText().toString());
                    if (mPhoneTextInputLayout.getEditText() != null)
                        user.setPhone(mPhoneTextInputLayout.getEditText().getText().toString());
                    if (mAddressTextInputLayout != null && user.getTempAddress() != null)
                    transaction.set(docRef, user);
                    return null;
                }
            }).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Snackbar.make(findViewById(android.R.id.content), "Failed to save updates",
                            Snackbar.LENGTH_SHORT).show();
                }
            });
        }
    });

当缺少互联网连接时,会显示Snackbar,但是当连接被激活并准备好更新数据时,会始终显示Snackbar。

2 个答案:

答案 0 :(得分:0)

将它放在OnCreate()方法的应用程序类中。

FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

答案 1 :(得分:0)

离线使用不支持交易 - 无法缓存或保存这些交易以供日后使用。这是因为事务绝对需要与服务器进行往返通信,以确保事务内的代码成功完成。