gpt4 book ai didi

android - 如果记录不存在于 LiveData 和 Room 会怎样?

转载 作者:行者123 更新时间:2023-12-05 03:53:03 25 4
gpt4 key购买 nike

代码A来自项目play-billing-samples,可以看here .

我认为 "SELECT * FROM gold_status LIMIT 1"可能没有返回记录,不知道是不是fun getGoldStatus(): LiveData<GoldStatus>是正确的说法,我想应该是Code B吧?

代码A

@Dao
interface EntitlementsDao {

@Query("SELECT * FROM gold_status LIMIT 1")
fun getGoldStatus(): LiveData<GoldStatus>
...
}

代码B

@Dao
interface EntitlementsDao {

@Query("SELECT * FROM gold_status LIMIT 1")
fun getGoldStatus(): LiveData<GoldStatus>?
...
}

最佳答案

谈到 Android 上的 Room 和 SQLite,我不是专家。但我想就这个问题分享我自己的观察和发现。

@P.Leibner 是对的 LiveData对象本身立即返回并且不为空。内容可能为空。

如果您查看 Dao 生成的代码,您会看到它是一个 Java 代码,如果没有与您的查询匹配的记录,它将返回 null。也没有注释可以帮助 Kotlin 编译器检查可空性。

因此,如果我们返回非空对象,我们不会收到编译器错误或 lint 警告

// Compiles but we might get NullPointerException at runtime.

fun getGoldStatus(): LiveData<GoldStatus>
// or
fun getGoldStatus(): GoldStatus

但是如果您在表中没有一行并且在 Kotlin 中将其标记为非空时开始对该对象执行某些操作,您将在运行时遇到 NullPointerExceptions。

注意:如果您返回 List<GoldStatus>,则不会发生这种情况或 LiveData<List<GoldStatus>> .如果没有匹配的行,它将只返回空列表。

在我遇到这些问题之前,我自己并不知道这一点。也许我在了解房间时错过了一些解释。我们只需要知道,如果您查询单行和列表,room 将返回 object 或 null,如果多行,则为空列表。

我更喜欢在 Dao 方法的返回类型中指定可空性。通过这种方式,我编写了以空安全方式使用它的其他代码。

我会称之为代码C

// Runtime NullPointerException safe.

fun getGoldStatus(): LiveData<GoldStatus?>
// or
fun getGoldStatus(): GoldStatus?

你也可以看看这个answer获取更多信息并查看 Dao 生成的代码示例。

关于android - 如果记录不存在于 LiveData 和 Room 会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61865447/

25 4 0