Android Firestore可观察以检查值是否存在

时间:2018-07-24 01:03:03

标签: android kotlin google-cloud-firestore rx-java2 rx-kotlin2

在我的注册活动中,在用户输入内容后,我有一些观察对象可以对TextInputEditText进行一些验证;他们会检查电子邮件是否具有经过验证的模式,密码是否大于六个或名称字段是否具有设计好的模式。

所以,我的问题是...是否可以创建一种可观察的方法来检查用户给定的电子邮件是否在FirebaseFirestore数据库中退出?

我已经尝试过了,但是没有结果-我不知道这样做是否是一个好习惯,但是我是新手,此外,没有关于RxJava / Kotlin和Firestore的示例找到

fun query(query: Query) {
    Observable.create<QuerySnapshot>{
        query.addSnapshotListener { it, firebaseFirestoreException ->
            if(it?.size() != 1) {
                Log.d("EMAIL", "Error")
                throw Exception(firebaseFirestoreException)
            } else {
                Log.d("EMAIL", "Continue")
            }
        }
    }
}

给出上面的代码-我100%确信这是完全错误的,因为它不会产生任何错误或任何东西-我将向您展示我的代码以验证用于执行此操作的电子邮件和观察者。

var emailObservable = RxTextView.afterTextChangeEvents(emailInput)
            .skipInitialValue()
            .map {
                emailWrapper.isErrorEnabled = false
                emailWrapper.error = null
                it.view().text.toString()
            }
            .debounce(1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread())
            .compose(verifyEmailPattern)
            .compose(retryWhenError {
                emailWrapper.error = it.message
            })

这是使用RxBindings进行检查的代码,我用来检查电子邮件是否具有有效模式,并且在下面,我将放置用于验证的变量:

private val verifyEmailPattern = ObservableTransformer<String, String> { observable ->
    observable.flatMap {
        Observable.just(it).map { it.trim() }
                .filter {
                    Patterns.EMAIL_ADDRESS.matcher(it).matches()
                }
                .singleOrError()
                .onErrorResumeNext {
                    if (it is NoSuchElementException) {
                        Single.error(Exception("Email not valid"))
                    } else {
                        Single.error(it)
                    }
                }
                .toObservable()
    }
}

基本上,我想做的是在 var emailObservable 中添加 .compose ,其中包含一个名为verifyIfEmailExists的变量,并在该变量中处理数据库查询以检查是否它存在,并且代码将是这样的:

var emailObservable = RxTextView.afterTextChangeEvents(emailInput)
        .skipInitialValue()
        .map {
            emailWrapper.isErrorEnabled = false
            emailWrapper.error = null
            it.view().text.toString()
        }
        .debounce(1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread())
        .compose(verifyEmailPattern)
        .compose(verifyIfEmailsExists)
        .compose(retryWhenError {
            emailWrapper.error = it.message
        })

但是如何使用Observable创建该变量以检查Firestore数据库中是否存在电子邮件?我不知道该怎么做。

[编辑]

我可能的解决方案是这样,不知道它是否是最好的,但至少我会尝试:

private val verifyIfEmailExists = ObservableTransformer<String, String> { observable ->
    observable.flatMap {
        Observable.just(it).map { it.trim() }
                .filter {
                    var q = db.collection("users").whereEqualTo("email", it)
                    q.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
                        if (querySnapshot?.isEmpty != null) {
                            isFieldExists = true
                        }
                    }
                    isFieldExists
                }
                .singleOrError()
                .onErrorResumeNext {
                    if (it is NoSuchElementException) {
                        Single.error(Exception("Email given is already taken!"))
                    } else {
                        Single.error(it)
                    }
                }
                .toObservable()
    }
}

0 个答案:

没有答案