iOS - NSFetchRequest:排序字符串长度

时间:2015-10-21 08:27:31

标签: ios core-data nspredicate nsfetchrequest

我试图按照其名称'的长度对核心数据实体进行排序。 property,这是一个字符串。

LocationNSManagedObject,其中包含name属性(字符串)。

以下是代码:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:[Location entityName]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", query]];
[fetchRequest setSortDescriptors:@[
    [NSSortDescriptor sortDescriptorWithKey:@"name.length" ascending:YES]]];
[fetchRequest setFetchLimit:3];
NSArray *locations = [context executeFetchRequest:request error:&error];

我希望name.length KVO运算符可以工作,但结果没有正确排序。

例如:如果模型包含三个Locationname属性是新奥尔良,纽约和纽卡斯尔,则生成的数组query ="新"应该是纽约,纽卡斯尔和新奥尔良。

我错过了什么吗?

谢谢, DAN

1 个答案:

答案 0 :(得分:2)

不幸的是,你无法在CoreData中访问NSString的.length和其他属性,

我建议在你的ManagedObject类中添加另一个属性(@property(nonatomic,retain)NSNumber * nameLength;),保持文本的长度并使用此属性对数据进行排序,更新名称后,更新nameLength,如果你想命名自动更新,你可以像这样使用KVO或覆盖setName

- (void)setName:(NSString *)newName
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveValue:newName forKey:@"name"];
    [self didChangeValueForKey:@"name"];

    NSUinteger length = newName.length;
    // setName will be called when object is created from the store, make sure you only update it when the actual length is changed, 
    if([self.nameLength unsignedIntegerValue] != length) {
        self.nameLength = @(length);
    }
}