在我的注册活动中,在用户输入内容后,我有一些观察对象可以对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()
}
}