android - 테이블 - 이너 쿼리




방 데이터베이스에서 같은 유형의 객체를 가진 다중 테이블 (3)

방을 응용 프로그램의 데이터베이스로 사용하고 있습니다. 특정 유형의 Object 를 별도의 테이블에 저장해야하는 시나리오가 있습니다. 예를 들어, Book.java 라는 Object 가져 가도록 할 수 있습니다.

이제 두 개의 SQL 테이블이 필요합니다.

  • Books_Read
  • Books_To_Read

SQL DB에 대한 명명 규칙을 무시하십시오. - 이것은 단지 예일뿐입니다.

문제

일반적으로 Book.java 클래스에서 @Entity(tableName = "Books_Read") 를 사용하고 해당 테이블 이름을 사용할 DAO 클래스가 있습니다.

것은이다; 그런 다음 어떻게 동일한 Book.java 클래스를 사용하여 Books_To_Read 테이블에 저장할 수 있습니까? @Entity(tableName = "Books_Read")Book.java 클래스의 일부로 이미 정의 Book.java 클래스에 대한 Books_To_Read 테이블을 정의 할 위치가 없습니다.

약간의 해커와 불협화음으로 보이는 유일한 해결책은 새로운 클래스를 만드는 것이 BookToRead.java 습니다. BookToRead.java 를 확장하고 BookToRead.java 를 확장하고 @Entity(tableName = "Books_To_Read") 를 수업.

의문

이 작업을 수행하는 더 좋은 방법이 있을까요? 아니면이를 처리 할 수있는 예상되는 방법입니까?


이것이 이것을 처리 할 수있는 예상되는 방법입니까?

아니 . 그것은 잘못된 접근법입니다. 몇 가지 이유로 중복 데이터제거 해야합니다.

  • 저장 공간이 필요합니다. 데이터베이스의 크기가 커지면 악화되기 시작합니다.

  • 시스템이 복잡해질 것입니다. 단일 필드를 업데이트하는 경우 다른 위치에서 동일한 작업을 수행해야 할 수 있습니다. 하나라도 빠뜨리면 전체 데이터가 일관성을 잃게됩니다. 단일 트랜잭션과 같은 조작을 수행 할 수 있습니다. 그러나 항상 데이터베이스 구조를 깨끗하게 유지하는 것이 좋습니다.


해결책

방법 1 : 새 테이블 소개

"Books" 라고 말한 하나의 테이블에만 책의 세부 사항을 저장할 수 있습니다. "Books_To_Read" 또는 다른 테이블은 "Books" 테이블에 대한 참조 만 포함해야합니다 ( "Books" 테이블 의 ID / 기본 키 사용 ). 그런 다음 JOIN 키워드를 사용하여 단일 쿼리에서 전체 레코드를 가져올 수 있습니다.

이 방법은 각 유형 (이 경우 읽은 책과 읽지 않은 책)이 고유 한 필드 세트 (예 : read_date, read_time은 읽지 않은 책, wish_to_read는 읽지 않은 책 )에 적합합니다.

방법 2 : 새 필드 소개

유형을 지정하는 새 유형을 간단히 추가 할 수 있습니다. 이 경우에는 두 가지 유형 (읽기 및 읽지 않음) 만 있고 부울 필드 ( is_read 와 같은 is_read )가 좋을 것입니다.

이것은 가장 쉬운 방법 일 것입니다. 그러나 행이 속한 유형을 표시하려는 경우에만 작동합니다. 유형별 데이터를 저장할 필요가 있고 그 목적을 위해 추가 필드를 도입 할 경우 해당 필드가 다른 유형에도 존재한다는 것을 기억하십시오.


나는 Ahamad가 대답을 할 때 샘플 앱을 쓰고 있었다.

Room 은 SQLite의 추상 레이어를 제공하여 SQLite의 모든 기능을 활용하면서 유창한 데이터베이스 액세스를 허용합니다.

주요 아이디어는 책 데이터를 한 테이블에 저장하고 다른 테이블에서 책의 ID를 사용하는 것과 같습니다. 내 샘플 project 한번 보아라.

logcat의 결과

02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 2 name = Book 1, author Author 1}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 2 name = Book 1, author Author 1}

@OneToMany(mappedBy="book_id")
private Set<Book> book

두 테이블을 연결하는 가장 좋은 방법이라고 생각합니다. 그것을 시도하고 다시 피드를 알려주십시오. 나는 해결책을 줄 것이다.





android-room