android - Firebase:如何检查文档写入是否成功
问题描述
我想检查我的数据库写入是否成功,以便向用户显示错误消息。
我目前的方法不起作用,因为它说“类型不匹配,找到所需的单元 EmailStatus”
目前的方法
class EmailRepositoryImpl : EmailRepository {
private val db = Firebase.firestore
override fun sendEmail(email: Email): EmailStatus<Nothing> {
db.collection("emails").document().set(email).addOnCompleteListener {
if (it.isSuccessful) return@addOnCompleteListener EmailStatus.Success<Nothing>
if (it.isCanceled) return@addOnCompleteListener EmailStatus.Error(it.exception!!)
}
}
}
状态密封类
sealed class EmailStatus<out T> {
data class Success<out T>(val data: T) : EmailStatus<T>()
data class Error(val exception: Exception) : EmailStatus<Nothing>()
}
甚至可以写这样的东西吗?据我所知,有一个通用的firebase error type
,但我没有发现任何与 kotlin 或 android 相关的东西......
我感谢每一个帮助,谢谢
编辑
我已经尝试获取我的文档,但我只是得到空值:(当我使用侦听器方法时,一切正常)
界面
interface EmailRepository {
suspend fun getEmail(): Flow<EmailEntity?>
}
接口实现
override suspend fun getEmail(): Flow<EmailEntity?> = flow {
val result = db.collection("emailprice").document("Email").get().await()
emit(result.toObject<EmailEntity>())
}
视图模型
private val emailEntity = liveData<EmailEntity?>(Dispatchers.IO) {
emailRepository.getCalibratePrice()
}
解决方案
问题是addOnCompleteListener
回调不返回任何东西(单位),而您正试图EmailStatus
从该范围返回一个。
你有三种方法:
- 创建一个接口,该接口将填充该值并将该 EmailStatus 返回到您的调用者层
- 当对 firebase 的异步调用完成时,使用 Coroutines 暂停此函数,然后返回该值
- 当数据准备好处理时,使用 Flow 提供数据
我认为做这个一次性操作最简单的方法是使用协程;我已经写了一篇关于那个的文章。
推荐阅读
- javascript - 浏览器后退按钮在 MVC 中提供“确认表单重新提交”
- java - Intent extra key - 在同意意图额外密钥上获得空值
- css - 如何用css制作弯曲的边框?
- fullcalendar - 根据extendedProps过滤Fullcalendar Scheduler Timeline视图资源
- cryptography - 超级账本结构的安全性如何?
- sql-server - intellJi 终极版中没有表格
- php - 如何在 laravel 中对 groupBy 查询求和列?
- c++ - 如何流式传输 .txt 文件中的数值并在同一程序中通过 ifstream 读取相同的数据
- r - 将 R 中每个分量的方差加倍
- python - 用于在打印语句中创建列表的技术名称是什么?