【问题标题】:Subquery and IN Statement in realm领域中的子查询和 IN 语句
【发布时间】:2016-08-11 07:58:48
【问题描述】:

我有三个领域对象。部门、部门和用户。部门是部门中的一种子部门。但是每个部分和每个部门都会有用户。

@interface Department : RLMObject

@property NSString *name;
@property BOOL isCollapsed;

@property (nonatomic, strong) RLMArray<Section> *sections;
@property (nonatomic, strong) RLMArray<User> *users;

@end

@interface Section : RLMObject

@property NSString *name;
@property BOOL isCollapsed;
@property RLMArray<User> *users;

@end 

@interface User : RLMObject

@property NSString *department;
@property NSString *email;
@property NSString *firstname;
@property NSString *lastname;
@property NSString *fullname;

@end

我想要做的是,我想搜索所有名字和姓氏包含“a”并与部门和部门链接的用户。

现在我正在做的是

searchText = [searchText lowercaseString];

RLMResults *sections = [Section objectsWhere:
                        [NSString stringWithFormat:@"SUBQUERY(users, $user, $user.fullname contains '%@' OR $user.nickname contains '%@').@count > 0",searchText,searchText]];

NSMutableArray *sectionNames = [NSMutableArray array];

for (Section *section in sections)
{
    [sectionNames addObject:section.name];
}

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(sections, $section, $section.name IN %@).@count > 0", sectionNames];

RLMResults *filteredDepartments = [[Department objectsWithPredicate:predicate] sortedResultsUsingProperty:@"name" ascending:YES];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SUBQUERY(users, $user, $user.fullname contains %@ OR $user.nickname contains %@).@count > 0",searchText,searchText];
RLMResults *departments = [filteredDepartments objectsWithPredicate:pred];

现在的问题是 sections 数组中有两个部分,但在 deparments 结果中,它返回 null。请帮忙。谢谢。

注意:如果一个用户已经属于某个部门,那么该用户将不会被包含在部门中。

【问题讨论】:

  • 过滤部门确实给了你结果吗?
  • 是的。它返回两个部分。过滤的部门是正确的。 @user3182143
  • 是因为 users.count == 0 在这个查询中吗? ` NSPredicate *pred = [NSPredicate predicateWithFormat:@"SUBQUERY(users, $user, $user.fullname contains %@ OR $user.nickname contains %@).@count > 0",searchText,searchText];`

标签: ios objective-c realm


【解决方案1】:

也许您不需要使用子查询。更简单地说,您可以在查询中使用ANY,如下所示:

[Department objectsWhere:
    @"ANY users.firstname CONTAINS %@ OR ANY users.lastname CONTAINS %@ OR ANY sections.users.firstname CONTAINS %@ OR ANY sections.users.lastname CONTAINS %@", searchText, searchText, searchText, searchText];

但我认为使用反向关系更容易。在 Realm 中,反向关系用RLMLinkingObjects 定义。 您可以向User 类添加反向关系,如下所示:

@interface User : RLMObject

...

@property (readonly) RLMLinkingObjects *departments;
@property (readonly) RLMLinkingObjects *sections;

@end

@implementation User

+ (NSDictionary *)linkingObjectsProperties {
    return @{@"departments": [RLMPropertyDescriptor descriptorWithClass:Department.class propertyName:@"users"],
             @"sections": [RLMPropertyDescriptor descriptorWithClass:Section.class propertyName:@"users"]};
}

@end

然后你可以从User的属性中获取用户所属的部门和部门,如下:

RLMResults *users = [User objectsWhere:@"firstname CONTAINS %@ OR lastname CONTAINS %@" , searchText, searchText];
for (User *user in users) {
    NSLog(@"%@", user.departments);
    NSLog(@"%@", user.sections);
}

【讨论】:

  • [Department objectsWhere: @"ANY employees.firstname CONTAINS %@ OR ANY employees.lastname CONTAINS %@ OR ANY subDepartments.employees.firstname CONTAINS %@ OR ANY subDepartments.employees.lastname CONTAINS %@", searchText, searchText, searchText, searchText]; 这个不工作也返回null。
  • RLMResults *users = [User objectsWhere:@"firstname CONTAINS %@ OR lastname CONTAINS %@" , searchText, searchText]; for (User *user in users) { NSLog(@"%@", user.departments); NSLog(@"%@", user.sections); } 这项工作给了我结果,但我必须按部门和部门再次将用户分组。我不明白为什么我的第一个从来没有工作过
  • @Aye 第一个示例是否起作用取决于数据。你能分享你的数据吗?
  • 是的。我更新了数据,然后它现在可以工作了。非常感谢你的帮助。 [Department objectsWhere: @"ANY users.firstname CONTAINS %@ OR ANY users.lastname CONTAINS %@ OR ANY sections.users.firstname CONTAINS %@ OR ANY sections.users.lastname CONTAINS %@", searchText, searchText, searchText, searchText]; 这个也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多