realm 문서를 보던 중 궁금한 점이 있어서 질문 드립니다.

조회수 1444회

realm 관련 질문만 지금 3번째인데... 제가 현재 한번에 빡 하고 끝내는 것이 아닌데다가 모르는 것도 많아서 한주에 조금씩 해서 ppt도 만들면서 하는 중이라 질문이 많은 것에 대하여 이해 부탁드립니다 ㅠ

김용욱 님이 답변을 잘해주셔서 여기에 질문을 올리게되네요 ㅠ

이번 질문은 realm 문서 중 쓰기와 질의 부분 쪽에 있습니다.

  1. [쓰기] - [객체 생성하기] 에서 copyToRealm()으로 Realm으로 복사를 시키면 원본 객체는 realm이 관리하지 않는 비관리 객체이고 copyToRealm을 통해 얻은 객체는 realm에 의해 관리되는 객체라고 하는데요 여기서 copyToRealm() 을 하여 반환되는 것을 다시 원본에 연결시켜주면 안되나요??
User user = new User("John");
user.setEmail("john@corporation.com");

// 객체를 Realm으로 복사하기. 어떤 추가적인 변경도 realmUser에 있을 수 있습니다.
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);
realm.commitTransaction();

이 윗부분이 문서에 적혀있는 내용이고
제가 말한 것은

realm.beginTransaction();
user = realm.copyToRealm(user);
realm.commitTransaction();


이렇게 하는 것입니다. 혹시 음... 자바의 특성상 이렇게 하면 안된다거나 하는 이슈가 있을까요?

2 [질의] - [연속 질의] 부분이 이해가 되지를 않습니다... ㅠ

처음에는 문서에 아래와 같은 예시가 들어져 있었기 때문에 연속 질의란 것은 질의를 통해 얻은 결과에 다시 질의를 통해 결과를 얻는 다는 것을 말하는 것으로 이해를 했습니다.

RealmResults<User> teenagers = realm.where(User.class).between("age", 13, 20).findAll();
User firstJohn = teenagers.where().equalTo("name", "John").findFirst();

이걸 다시쓰면 이렇게 할수도 있겠지요

User firstJohn = realm.where(User.class)
            .between("age", 13, 20)
`          `.findAll()
            .where()
`           .equalTo("name", "John")
            .findFirst();

이런식으로 findall 다음에 다시 where를 해서 하는 것이 연속 질의가 이런 것인 줄 알았습니다. 그런데 바로 밑에는 이러한 것과는 다른 예시를 들고 있어서 어렵내요....

RealmResults<User> teensWithPups = realm.where(User.class).between("age", 13, 20).equalTo("dogs.age", 1).findAll();

여기에는 findAll을 하여 RealmResult에 대한 것을 얻고 거기에 다시 질의를 하는 형태의 예시가 아니였습니다.

그런데 문제는 또 바로 밑에 적혀있는 설명에는 연속 질의는 RealmQuery가 아닌 RealmResults에 기반하고 있다는 것을 유의하라고 적혀있습니다.

음..... 질문의 요점이 이해가 안되실거 같은데 핵심만 여쭤보자면.....

연속 질의(chaning Query)는 무엇인가요...?

마지막으로 [관계] - [연결 질의] 를 보니 2번 질문에서 드렸던 연속 질의는 chaning query이고 연결 질의는 link query라고 되어있는데 연결질의와 연속 질의는 다른 것인가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 1번은 생각하신 내용이 맞다고 봅니다. 혹시 테스트를 해보셨을 때 안되셨나요?

    // r1 => [U1,U2]
    RealmResults<Person> r1 = realm.where(Person.class)
                                 .equalTo("dogs.name", "Fluffy")
                                 .equalTo("dogs.color", "Brown")
                                 .findAll();
    

    이렇게 쿼리를 다른 쿼리로 이어가는 것이 link query(연결 질의)입니다.

    // r2 => [U2]
    RealmResults<Person> r2 = realm.where(Person.class)
                                 .equalTo("dogs.name", "Fluffy")
                                 .findAll()
                                 .where()
                                 .equalTo("dogs.color", "Brown")
                                 .findAll();
                                 .where()
                                 .equalTo("dogs.color", "Yellow")
                                 .findAll();
    

    결과에서 다시 where()을 통해 질의로 들어가는 것이 chaining query(연속 질의)입니다.

    해당 문서에서 잘못된 부분이 있어 확인하여 피드백을 하였습니다. 그리고 연속 질의라는 표기를 연쇄 질의로 바꿀지 고민중입니다.

    추가적인 피드백을 위해서 메일 주소를 알 수 있을까요? kr@realm.io로 메일을 주시면 다시 피드백을 드리겠습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다! 제가 자바나 안드로이드를 완벽하게 때고 한것은 아니라서... 매주 조금씩 공부를 해보는 중입니다. 오류가 있거나 한점에 대해서는 앞으로 저기로 메일을 보내보도록 하겠습니다!! 궁금한 점에 대해서는 메일과 여기에 질문을 올리는 것 어떤 것이 더 좋을까요? 일단 제 메일은 tutan123@naver.com 입니다! 알 수 없는 사용자 2016.7.13 15:56
    • 다시 확인해보니 문장의 구성은 chaining query를 질의하다가 효율을 위해 질의에 질의를 추가하는 link query를 설명하는 형태였네요. 문장을 좀 더 다듬으면 좋겠는데 일단 피드백을 해보았습니다. 알 수 없는 사용자 2016.7.14 15:25
    • 넵! 감사합니다!! 알 수 없는 사용자 2016.7.14 21:03

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)