Android Room Bug в Котлине - PullRequest
       12

Android Room Bug в Котлине

0 голосов
/ 02 ноября 2018

Я думаю, что это семантическая проблема в комнате во время работы в Котлине. Простой DAO запрос в комнате можно получить по

@Query("SELECT * FROM Users WHERE id = :id")
fun getUser(id: Int): User

Несмотря на то, что я определил тип возвращаемого значения как User, а не User?, этот запрос все еще может возвращать ноль, когда Пользователь не имеет заданного id .

Поэтому, когда вы вызываете эту функцию, вам обязательно нужно проверять возврат null, как показано ниже

val user = userDao.getUser("someid")
if (user != null){
    return user
}
else {
    return DEFAULT_USER
}

Но так как мы определили тип возвращаемого значения getUser как User, компилятор @kotlin предполагает, что проверка null является избыточной .

Я что-то упустил? Кто-нибудь может дать какой-то отзыв по этому поводу?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Видимо, это уже отслеженная проблема в Google Issue Tracker И в ответ разработчики говорят

Статус: не исправляется (предполагаемое поведение)

это не о сгенерированном коде тем не менее, вы тот, кто создает этот метод запроса, поэтому вы должны объявить его обнуляемым.

Итак, если мы знаем, что наш код может вернуть null, мы должны объявить его как Nullable как

@Query("SELECT * FROM Users WHERE id = :id")
fun getUser(id: Int): User?
0 голосов
/ 02 ноября 2018

Нет семантической проблемы. Если Ваша функция может вернуть ноль, это должно быть определено в типе возврата функции. Итак, ваша подпись функции должна быть такой

fun getUser(id: Int): User?

Это означает, что функция может возвращать ноль, и теперь ваши нулевые проверки должны работать нормально.

...