87 votes

Base de données Hardcode Boolean Query In Room

Je suis en train de construire une application Android qui affiche une liste de correspondances possibles pour un utilisateur. L'utilisateur peut cliquer sur l'un comme à l'utilisateur, et je sauvegarde tous ceux qui aime localement.

Je peux écrire une requête pour obtenir la liste des matchs comme celui-ci:

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

J'ai appris que cela fonctionne bien. Cependant, je ne prévois aucun scénario où je vais jamais fixé liked de faux, et donc je suis curieux de savoir si il existe un moyen de coder en dur ma condition Booléenne? Si j'essaie:

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

J'obtiens l'erreur suivante lors de la compilation:

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

Comment puis-je coder de cette valeur dans ma chaîne de requête?

J'ai aussi essayé:

  • Habillage de l'état dans des guillemets simples
    • @Query("SELECT * FROM match WHERE liked = 'true' ORDER BY match DESC LIMIT :limit")

226voto

CommonsWare Points 402670

SQLite n'a pas de type de données booléenne. La chambre le cartographie à une colonne, cartographiant à et à `````` .

Donc, je m'attends à ce que cela fonctionne:

Gardez à l'esprit que ce comportement est sans papiers. Cependant, il ne devrait pas changer - du moins pas sans klaxons d'alarme retentissant - que nous aurions besoin d'utiliser les migrations pour faire face à tout changement.

31voto

methodsignature Points 523

CommonWare approche fonctionne et répond aussi à la Fpo question directement; cependant, je ne suis pas un fan de rendre une telle hypothèse au sujet de la base de données. L'hypothèse doit être sûr, mais il peut créer des imprévus de travail sur la route si la Chambre décide un jour de changer booléennes de mise en œuvre.

Je suggère que la meilleure approche est de ne pas coder en dur le booléen 1 ou 0 dans la requête. Si la base de données est derrière un référentiel, il est toujours possible pour le dépôt d'exposer une gracieuse de l'API. Personnellement, je pense que le blindage de la plus grande base de code à partir de la base de données de mise en œuvre est une bonne chose de toute façon.

Méthode Dao (copié à partir de l'OP de la question)

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

Référentiel

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

Bien sûr, c'est un opiniâtre option en ce qu'il suppose un certain style architectural. Cependant, il ne permet pas de faire des hypothèses sur la base de données interne. Même sans le référentiel de la protection de la base de données, l'appel peut être fait dans la base de données en passant vrai partout - aussi sans faire d'hypothèses sur les données sous-jacentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X