首页 > 解决方案 > 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()
}

标签: androidfirebasekotlingoogle-cloud-firestoresealed-class

解决方案


问题是addOnCompleteListener回调不返回任何东西(单位),而您正试图EmailStatus从该范围返回一个。

你有三种方法:

  1. 创建一个接口,该接口将填充该值并将该 EmailStatus 返回到您的调用者层
  2. 当对 firebase 的异步调用完成时,使用 Coroutines 暂停此函数,然后返回该值
  3. 当数据准备好处理时,使用 Flow 提供数据

我认为做这个一次性操作最简单的方法是使用协程;我已经写了一篇关于那个的文章


推荐阅读