2016-06-03 2 views
0

사람 및 그룹. 각 그룹에는 몇 명입니까? SQL 데이터베이스의 간단한 시나리오. 렐름에서 이것을 가져 오는 것을 도와주세요. 내가 그들 각 사람의 총 수와 모든 그룹의 목록을 얻을 필요가카운트가있는 범위 하위 쿼리

@interface GroupObject : RLMObject 

@property int idx; 
@property NSString *name; 

:

@interface PersonObject : RLMObject 

@property int idx; 

@property NSString *firstName; 
@property NSString *lastName; 

@property RLMArray <PersonGroupId *> <PersonGroupId> *connectedGroupIds; 

그리고 그룹 :

나는 사람들 있습니다. 현재 그것은 그룹을 통해 반복에 의해 이루어집니다 그리고 정말 느리다 :

for (GroupObject *group in groups) 
    { 
     RLMResults *result = [PersonObject objectsWhere:@"ANY connectedGroupIds.idx == %d",group.idx]; 
     group.numberOfMembers = result.count; 
    } 

이 그룹을 통해 반복하지 않고 하나 개의 쿼리/하위 쿼리와 그를 가져올 수 있습니까?

+0

코드에서 언급 한'PersonGroupId' 클래스의 선언을 공유해 주실 수 있습니까? – bdash

+0

@bdash '@interface PersonGroupId : RLMObject @property int idx; @ end' – Dmitry

+0

@bdash 현재 모델에서 하나의 쿼리로 필요한 것을 가져올 수 있습니까? – Dmitry

답변

0

사람이 여러 그룹에 속할 수 있고 그룹에 여러 사람이 포함될 수있는 시나리오를 모델링하려는 것 같습니다. 내가 좋아 보이는 모델을 제안하십시오 그렇게하려면

@interface PersonObject : RLMObject 

@property NSString *firstName; 
@property NSString *lastName; 

@property RLMArray<GroupObject> *connectedGroups; 

@end 


@interface GroupObject : RLMObject 

@property NSString *name; 

@property RLMLinkingObjects<PersonObject> *members; 

@end 


@implementation GroupObject 

+ (NSDictionary *)linkingObjectsProperties 
{ 
    return @{ @"members": [RLMPropertyDescriptor descriptorWithClass:PersonObject.class propertyName:@"connectedGroups"] }; 
} 

@end 

이 오히려 당 객체 식별자를 사용하여 모방하는 것보다 영역의 관계에 대한 지원 내장의 장점을합니다. 이 모델을 사용하면 group.members.count을 사용하여 그룹의 구성원 수를 결정할 수 있습니다.

+0

예, 다 대다 관계입니다. Realm의 데이터 모델은 서버의 MySQL에 저장된 데이터의 로컬 저장소이기 때문에 객체의 ID를 유지해야합니다. 하지만 ID를 유지하고 여전히 제안 된 접근법을 사용할 수 있다고 생각합니다. 맞습니까? 나는 렐름을 처음 접했습니다. 바보 같은 질문에 사과드립니다. LinkingObjects 접근법을 사용할 때 특정 Person과 특정 그룹 간의 연결이 어떻게 이루어 집니까? – Dmitry

+0

예,이 방법을 사용할 때 ID를 저장할 수 있습니다. 나는 더 이상 문제를 해결하는 데 관련이 없으므로 그냥 생략했습니다. 'LinkingObjects'는 객체와 관계가있는 객체를 나타내는 콜렉션입니다 (귀하의 경우에는 그 객체의'connectedGroups' 배열에 그룹이 있습니다). '[somePerson.connectedGroups addObject : someGroup]'을 실행하면'someGroup.members'에는'somePerson'이 포함됩니다. – bdash

+0

현재 서버에서 사람들과 그룹을 얻었을 때 나는 그들을 렐름에 집어 넣었고, 페칭 할 때 ID로 링크했기 때문에 서로를 연결하는 것에 신경 쓰지 않았습니다. 이 방법을 사용하면 사람과 그룹을 가져 오거나 삭제하거나 편집 할 때 항상 연결을 만들거나 업데이트해야한다는 것을 기억해야합니다. 맞습니까? 또한, 나는 사람이 합류하거나 특정 그룹을 떠날 때 날짜를 저장해야하는 또 다른 경우가 있습니다. 어떻게'LinkingObjects' 접근법에 적합할까요? 이 데이터는 어디에 저장합니까? – Dmitry