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

ROOM DB) 데이터를 테이블에 각각넣는 방법을 모르겠습니다 ㅠㅠ.

0 추천

회의제목 : '안녕히' 를 입력하고 리더실행을 누르면 QR코드 리더 실행기로 넘어갑니다.

 

ROOM DB에 담긴값을 리사이클러뷰에 출력하였습니다. (저는 새로운 회의제목을 생성하려고합니다.)

'안녕하다' 라는 새로운 회의제목을 생성했을때 리사이클러뷰에 값이 없고 새로운 값을 넣는 테이블을 만들고싶습니다.

 

[정보조회] 버튼을 누르면 위와 같이 리스트로 회의제목이 출력이되며, 옆에 조회 버튼을 누르면 각 회의제목에 태그가된 값들이 다음페이지에 출력이 되려고 합니다.

 

idtitle
12023-05-07 23:48:28 김xx, 010-xxxx-xxxx,개발팀
22023-05-07 23:48:32 김xx, 010-xxxx-xxxx,개발팀

 현재 RoomDB에는 이런식으로 저장중에 있으며.

 

idtitletimenameteam
1안녕히2023-05-07 23:48:28개발팀
2안녕히2023-05-07 23:48:30개발팀
3안녕히2023-05-07 23:48:32개발팀
4안녕하다2023-05-07 23:48:35지원팀
5안녕하다2023-05-07 23:48:37지원팀
6안녕하다2023-05-07 23:49:28지원팀
7안녕하다2023-05-07 23:48:48지원팀
8안녕하다2023-05-07 23:50:17지원팀
9안녕하소2023-05-07 23:52:25지원팀
10안녕하소2023-05-07 23:53:21경영팀
11안녕하소2023-05-07 23:56:12경영팀
12안녕하소2023-05-07 23:58:28경영팀
13안녕하개2023-05-07 23:58:32경영팀
14안녕하개2023-05-07 23:59:59경영팀

이런식으로 회의명 따로, 시간따로, 이름, 소속 따로 테이블에 넣고싶습니다.

 

긴글읽어주셔서 감사합니다. 

 

현재 태그해서 불러오는 값은 리사이클러뷰에 보이는 바와같습니다.

 

 

최고가되고싶은개발자 (400 포인트) 님이 2023년 5월 7일 질문
최고가되고싶은개발자님이 2023년 5월 8일 수정

1개의 답변

+1 추천
 
채택된 답변
ROOM DB는 Entity, DAO 같은 볖도의 구조가 존재하므로 기본 사용법을 먼저 숙지하시는게 좋습니다. (https://developer.android.com/training/data-storage/room)

DB의 동작은 DAO 인터페이스를 통해서 처리합니다. 그리고 Rxjava, Coroutine 을 쓰레딩처리에 사용할 경우는 리턴타입 등 메소드/함수의 모양이 살짝 달라집니다.(https://developer.android.com/training/data-storage/room/async-queries)

https://developer.android.com/training/data-storage/room/async-queries 하단에 보시면 구글 샘플앱 링크가 있습니다. 이걸 참조하시면 원하시는 부분의 처리를 하실 수 있을 겁니다.
spark (227,510 포인트) 님이 2023년 5월 8일 답변
최고가되고싶은개발자님이 2023년 5월 8일 채택됨
안녕하세요. 답글 감사합니다. title과 태그해서 불러오는 값을 테이블에 넣는 기능은 성공하였습니다.

이제는 title을 가지고 리스트를 조회해야 하는데 저기 섞여 있는 title에서 안녕히 만 조회할 수 있고 안녕하다 만 조회할 수 있나요???

젤 좋은거는 테이블따로 생성해서 리사이클러뷰를 가져오면 되는데...
query를 작성하시면 됩니다.

@Dao
public interface YourDAO {
    @Query("SELECT * FROM 테이블명 WHERE title = :title")
    List<리턴타입> findByTitle(String title);
}

YourDAO dao = database.yourDao();
dao.findByTitle("안녕히");

위에 알려드린 링크에 나오는 내용입니다. 커스텀 쿼리는 SQL을 기본적으로 아셔야 작성하실 수 있습니다.
답변감사합니다...

제가 원하는 쿼리방법은 저기 예시로 테이블에 생성된 값들이 아닌 (findBy 말구..)

 Edittext의 텍스트를 읽어서 타이틀 별로 가져오는 쿼리문을 원합니다...

그 쿼리문을   

@Query("SELECT * FROM table_name WHERE title = :title")
    List<MainData> getByTitle(String title);

작성하였는데 액티비티에 녹여야하는데 녹이는 방법을 잘 모르겠습니다..

제가 궁금한 사항은

타이틀을 받아옴. 조회 버튼을 눌러서 타이틀에 있는 값들을 표시한다 ??

타이틀이 변경이 되면 에딧텍스트를 읽어야하는데 에딧텍스트는 (어디에있는 에딧텍스트 ???) 쿼리문에 있는 에딧텍스트 인가요???

입니다. 혼자서 공부를 해봐도 도저히 이해가 가질않네요... 도와주시면 감사하겠습니다..
공부하셔야할 게 좀 많아 보이네요.
액티비티 내에서 findViewById 메소드를 사용하면 뷰를 찾을 수 있습니다. 이걸로 버튼을 찾아서 멤버변수에 저장하고 버튼의 setOnClickListener 메소드에 View.OnClickListener 인터페이스의 인스턴스를 넘겨줘서 클릭이벤트를 처리하도록 하세요.
View.OnClickListener의 onClick메소드에 데이터베이스 쿼리를 실행할 수 있도록 코드를 작성하시면 되는데, 이 부분부터가 배우셔야 할 게 많습니다. 안드로이드는 IO 처리는 메인쓰레드에서 하지 못하는게 기본 설정입니다. 데이터베이스도 IO에 해당하므로 메인쓰레드에서 처리할 수 없는게 기본옵션입니다. 강제로 메인쓰레드로 처리하도록 할 수는 있지만, 권장하지 않습니다. 따라서 백그라운드 쓰레드에서 작성하신 DAO의 메소드를 호출해야 하는데, 백그라운드 쓰레드를 사용하는 방법에는 여러가지가 있을 수 있는데, 많이 사용하는 방법은 자바의 경우는 RxJava라는 라이브러리를 사용하는 것이 (상당히 복잡한 라이브러리로 배우는데 오래 걸리지만, 한번 배워놓으면 이점이 많습니다.) 다른 하나는 직접 쓰레드를 생성해서 처리하는 것인데, 디테일한 처리를 하려면 신경써야할 부분들이 많습니다.

아래 링크를 보시면 자바에서 어떻게 백그라운드 쓰레드를 이용해 IO처리를 할 수 있는지 확인하실 수 있습니다.
https://developer.android.com/guide/background/asynchronous/java-threads

하나씩 차근차근 찾아가시면서 작업하시기 바랍니다.

직접적인 코드는 작성해야될 분량이 너무 많아서 생략하겠습니다.
우여곡절끝에 궁금한 사항들을 링크 찾아가면서 해결하였습니다. 감사합니다 XD

그 쿼리문을 작성하는데 DISTINCT가 안먹혀서 애를 먹고있습니다... 자바로 코딩을 계속하고있는데 DISTINCT말고도 다른 방법도있을까요...?

@Query("SELECT DISTINCT title FROM table_name")
    List<MainData> getDistinctValuesFromColumn(String title);

가 먹히질 않습니다... Room db에 분명 title 값이 잘 들어가는데... ㅠㅠ

에러는 title이 컬럼에 없다고 뜹니다...
Android Studio에 DB explorer가 있습니다. 거기에서 해당 쿼리를 직접 실행 시켜서 해당 쿼리가 이상없이 잘 실행되는지 확인해 보세요. 그리고 현재 리턴타입이 List<MainData>인데 쿼리를 실행하면 List<String>이 나올 것 같습니다.

title이 중복되지 않는 레코드만 가져오고 싶으시다면, 아래 쿼리를 테스트 해보세요.
title별로 id가 가장 작은 레코드를 하나씩만 가져온 후에, 이 id 들과 일치하는 레코드들만 가져오는 쿼리입니다

SELECT * FROM table_name
WHERE id IN (SELECT MIN(id) FROM table_name GROUP BY title)
...