2017-12-09 3 views
4

나는 잠재적 인 일치하는 사용자의 목록을 표시하는 안드로이드 응용 프로그램을 만들고 있습니다. 사용자는 사용자를 좋아하기 위해 하나를 클릭 할 수 있으며, 나는 좋아하는 것을 모두 로컬에 저장합니다.하드 코드 부울 쿼리 룸 데이터베이스

I는 다음과 같이 일치의 목록을 얻으려면 쿼리를 작성할 수 있습니다

@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")

답변

13

SQLite는의 조건을 바꿈. 이 방을 INTEGER 열로 매핑하여 true에서 1false에서 0으로 매핑합니다.

그래서, 나는이 일을 기대 :

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

곰을 염두에두고이 문제가 문서화된다. 그러나 변경 사항을 처리하기 위해 마이그레이션을 사용해야하므로 경보가 울리지 않고 —을 변경해서는 안됩니다.

+0

감사합니다.방의 문서에서이 부분을 놓친 것 같습니다. – AdamMc331

+2

@ AdamMc331 : 특히 최근에 변경된 후에는 Room 설명서에서 Room 설명서가 누락되었다고 주장합니다. :-(그러나 나는 그것이 당신을 위해 일하고있어서 기뻐요! – CommonsWare

+0

글쎄, 이걸 가지고있어! : P – AdamMc331

2

CommonWare의 접근 방식이 효과적이며 OP 질문에 직접 대답합니다. 그러나 나는 데이터베이스에 대한 그런 가정을하는 팬이 아니다. 가정은 안전해야하지만 Room이 부울 구현을 변경하기로 결정한 경우 예상치 못한 문제가 발생할 수 있습니다.

더 나은 방법은 부울 1 또는 0을 쿼리에 하드 코딩하지 않는 것입니다. 데이터베이스가 저장소 뒤에있는 경우에도 저장소가 적절한 API를 노출 할 수 있습니다. 개인적으로 데이터베이스 구현에서 더 큰 코드베이스를 보호하는 것이 좋은 방법이라고 생각합니다. (OP의 질문에서 복사)

다오 방법 물론

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

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

저장소,이는 특정 건축 양식을 가정합니다의 의견을 고집하는 옵션입니다. 그러나 내부 데이터베이스에 대한 가정은하지 않습니다. 데이터베이스를 보호하는 저장소가 없어도 기본 데이터에 대한 가정없이 모든 곳에서 true를 전달하여 데이터베이스에 호출 할 수 있습니다.