Конечно, это вариант самоуверенный в том смысле, что он предполагает определенный архитектурный стиль. Тем не менее, он не делает предположений о внутренней базе данных. Даже без репозитория, экранирующего базу данных, вызов может быть сделан в базу данных путем передачи true везде - также без предположений относительно базовых данных.

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

Я могу написать запрос, чтобы получить список совпадений, как это:

@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>

Я узнал, что это прекрасно работает. Однако я не предвижу сценарий, в котором я когда-либоliked в false, и поэтому мне любопытно, есть ли способ жестко закодировать мое логическое условие? Если я попробую:

@Query("SELECT * FROM match WHERE liked = true ORDER BY match DESC LIMIT :limit")

Я получаю следующую ошибку во время компиляции:

Error:(8, 0) Gradle: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: true)

Как я могу жестко закодировать это логическое значение в строке запроса?

Я также попробовал:

Заключение условия в одинарные кавычки@Query("SELECT * FROM match WHERE liked = 'true' ORDER BY match DESC LIMIT :limit")

Ответы на вопрос(2)

Решение Вопроса

INTEGER столбец, отображениеtrue в1 а такжеfalse в0.

Итак, я ожидаю, что это сработает:

@Query("SELECT * FROM match WHERE liked = 1 ORDER BY match DESC LIMIT :limit")

Имейте в виду, что это поведение недокументировано. Тем не менее, он не должен меняться - по крайней мере, без звучания тревожных клаксонов - так как нам нужно использовать миграцию, чтобы справиться с любыми изменениями.

 CommonsWare09 дек. 2017 г., 17:59
@ AdamMc331: В частности, после их последнего раунда изменений, я бы сказал, что в документации комнаты не было документации комнаты. :-( Но я рад, что это работает на вас!
 AdamMc33109 дек. 2017 г., 18:19
Ну, я получил это далеко с этим! :П
 Aenadon16 февр. 2018 г., 16:06
О да, документация по комнате очень скудная ... спасибо!
 AdamMc33109 дек. 2017 г., 17:56
Это сработало, спасибо! Я определенно думаю, что это было упущено в документации зала.

Тем не менее, я не фанат делать такое предположение о базе данных. Предположение должно быть безопасным, но оно может создать неожиданную работу в будущем, если Room когда-либо решит изменить свою логическую реализацию.

Я бы предположил, что лучший подход заключается в том, чтобы не вводить в запросе логическое значение 1 или 0. Если база данных находится за хранилищем, для хранилища все еще возможно предоставить изящный API. Лично я считаю, что в любом случае хорошо защищать базу кода от реализации базы данных.

Метод Дао (скопировано из вопроса ОП)

@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>

вместилище

class Repository {
    public Flowable<List<Match>> getLikedMatches() {
        return dao.getMatches(6, true);
    }
}

Конечно, это вариант самоуверенный в том смысле, что он предполагает определенный архитектурный стиль. Тем не менее, он не делает предположений о внутренней базе данных. Даже без репозитория, экранирующего базу данных, вызов может быть сделан в базу данных путем передачи true везде - также без предположений относительно базовых данных.

Ваш ответ на вопрос