룸 데이터베이스에서 열 이름을 매개 변수로 전달하는 방법은 무엇입니까? [복제]
Dec 11 2020
사용 roomdatabase
하고 있으며 쿼리 할 범주가 많이 있습니다.
@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();
@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();
그래서 질문은 하나의 범용 쿼리를 만들고 열 이름을 매개 변수로 전달할 수 있다는 것입니다. 예를 들면 :
@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks);
columnName을 참조한다는 것을 알고 있지만 columnName이 유형 int
이면 안됩니까?
LiveData<List<Item>> getAllDrinks(int drinks)
답변
Zain Dec 11 2020 at 22:23
짧은 답변 : SQLite가이를 허용하지 않기 때문에 그렇게 할 수 없습니다 . 여기를 확인하십시오 .
긴 답변 :
모델에는 몇 가지 단점이 있습니다.
- 데이터베이스 디자인 모델 : 데이터 정규화 측면에서 좋은 데이터베이스 디자인은 아닙니다 . 왜? 에 대한 열이
sweets
있고 다른drinks
하나는meals
..에 대한 열이있을 수 있습니다. 더 많은 열은 더 많은 데이터 저장 공간, 레코드의 더 많은 null 허용 필드를 의미하며 각 열을 개별적으로 쿼리하기위한 데이터베이스 메서드가 필요합니다 (예 : 질문 내용) - 변수 열 이름을 가지려면 오류가 발생하기 쉽습니다. 데이터베이스에없는 열을 전달하면 어떻게 될까요. Room이 컴파일 시간 오류를 제공
Room
하는 추상적 인 기능을 제공 하는 기능 중 하나입니다.SQL queries
정상적인 SQLite가 런타임에 열 이름을 올리는 동안 잘못된 열 이름.
내가 당신에게 권장하는 것 :
음식 유형을 나타내는 단일 열을 만듭니다. 효율성을 위해 유형을 만들고 int
각 정수 값을 특정 유형의 음식에 매핑 할 수 있습니다 .
1 >> goes for >> sweats
2 >> goes for >> drinks
and so on..
이제 단일 열이 있습니다 (모델 에서처럼 여러 열이 아님) 이제 모든 유형에 액세스하는 단일 DAO 메서드를 가질 수 있습니다 (요청했던).
@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type
참고 : 또한 가독성 Enum
을 위해 필드에를 사용하고 방 유형을 변환 할 수 있습니다 .