마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Room 쿼리 변수 전달 질문

0 추천

안녕하세요 안드로이드 Room에서 쿼리문을 작성하려는데 찾아봐도 잘 모르겠어서 글 남겨봅니다...

이런식으로 있는 테이블이 존재하는데

쿼리의 메소드를 b를 넘겨주면서 호출하면 name1컬럼의 B를 얻어오는 방법을 모르겠습니다..

 

psh0036 (190 포인트) 님이 2022년 9월 16일 질문

1개의 답변

0 추천
 
채택된 답변
@Entity
public class User {
    @PrimaryKey
    public int id;

    public String name1;
    public String name2;
}


@Query(
  "SELECT * FROM user WHERE name2 = :name2"
)
public User getUserByName2(String name2);
// public List<User> getUsersByName2(String name2);

 

리턴타입을 님의 테이블 구조에 맞게 변경하세요. User.name1 으로 접근하시면 될 것 같은데요.

spark (226,420 포인트) 님이 2022년 9월 16일 답변
psh0036님이 2022년 9월 19일 채택됨
name2가 unique key가 아니라면 테이블에 같은 name2가 여려 개 존재할 경우 에러가 날 수 있기 때문에 그런 경우는 List<User>와 같은 콜렉션 타입을 리턴타입으로 사용하셔서 처리를 하셔야 할 겁니다.
감사합니다! 혹시 해당 쿼리문을 통해서 얻은 결과를 String변수에 저장할수있는 방법은 없을까요?
Room DB는 ORM이라서 기본적으로 Entity에 정의된 타입을 리턴합니다. User 객체를 리턴해서 원하는 필드를 가져다 사용하세요. 굳이 name1만 리턴하고 싶다면 중간에 클래스(예를 들면 Repository)를 하나 두셔서 내부적으로 DAO를 사용해서 처리하시고 원하는 값만 리턴하시면 돨 것 같은데요.

public class UserRepository {
    
    private final UserDao userDao;
     
    public UserRepository(UserDao UserDao) {
        this.userDao = userDao;
    }

    @Nullable
    public String getUserName1ByUserName2(String name2) {
         User user = userDao.getUserByName2(name2);
         return user == null ? null : user.name1;
    }
}
항상 친절한 답변 감사드립니다 선생님.
계속 시도해보고있지만 어떤이유에서인지 쿼리문이 제대로 동작이안되네요..
혹시 제가 assets을 통해 미리 넣어놓은 db파일을 조회하려는 것인데 그것때문일까요...
안드로이드 스튜디오에 DB explorer 가 내장되어 있어요. 거기서 쿼리문을 먼저 실행해 보시고 잘 되는지 확인해 보세요.
선생님이 알려주신 쿼리문으로 String값 받아오는데 성공했습니다!
결국 asset에 넣어놓은 db로는 실패하긴했지만 좀더 공부해서 해보도록 하겠습니다!
왜 에러가 나는지 에러 로그를 확인해 보세요. 흔히 발생할 수 있는 에러는, Entity 구조가 맞게 되어 있는지, Dao 실행을 별도의 설정없이 메인쓰레드에서 하는지, Dao에 있는 메소드의 리턴타입 등이 맞게 되어 있는지 등을 잘 체크해 보세요. 제일 확실한 건 Room 에러 로그에 있을 겁니다.
...