我试图按照其名称'的长度对核心数据实体进行排序。 property,这是一个字符串。
Location
是NSManagedObject
,其中包含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运算符可以工作,但结果没有正确排序。
例如:如果模型包含三个Location
,name
属性是新奥尔良,纽约和纽卡斯尔,则生成的数组query
="新"应该是纽约,纽卡斯尔和新奥尔良。
我错过了什么吗?
谢谢, DAN
答案 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);
}
}