iOS - NSFetchRequest:对字符串长度进行排序

Posted

技术标签:

【中文标题】iOS - NSFetchRequest:对字符串长度进行排序【英文标题】:iOS - NSFetchRequest: sorting for string length 【发布时间】:2015-10-21 08:27:30 【问题描述】:

我正在尝试按其“名称”属性的长度对核心数据实体进行排序,该属性是一个字符串。

Location 是一个包含name 属性(字符串)的NSManagedObject

代码如下:

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 属性是New Orleans、New York 和Newcastle,则query = "New" 的结果数组应该是New York、Newcastle 和New Orleans。

我错过了什么吗?

谢谢, 丹

【问题讨论】:

它的字符串比较,所以这可以帮助你***.com/questions/24331566/… 嗨@abrarulhaq,感谢您的回答,但不幸的是,该解决方案正是我正在做的,使用 KVO 运算符(在这种情况下,用户使用的是长度而不是 intValue)。 也许您应该发布完整的搜索 sn-p 以及您的结果和期望。 没问题!问题已更新 @DAN - 您应该始终为您的 CoreData 问题提供具体的详细信息。有很多活动部件,并且根据您使用它的方式而有所不同。例如,这个问题中缺少的重要部分是您正在使用 SQLite 存储。其他商店的行为不同。 【参考方案1】:

很遗憾,您无法在 CoreData 中访问 .length 和 NSString 的其他属性,

我建议在您的 ManagedObject 类中添加另一个属性(@property (nonatomic, retain) NSNumber * nameLength; ),保存文本的长度并使用此属性对数据进行排序,更新名称后,更新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);
    

【讨论】:

太糟糕了!谢谢你的帮助:) 最后一件事,您会在模型中添加 nameLength 作为实体的属性吗? 这并不完全正确。您可以在某些商店中访问 .length 属性,但不能在 SQLite 商店中访问。

以上是关于iOS - NSFetchRequest:对字符串长度进行排序的主要内容,如果未能解决你的问题,请参考以下文章

ios: NSFetchRequest 和过滤

NSFetchRequest 谓词不一致 iOS (NSFetchedResultsController) 与 Mac (NSArrayController)

NSFetchRequest 控制器在 iOS 5 上工作,在 iOS 4.3 上崩溃

iOS 核心数据 - NSFetchRequest 和 NSPredicate 不允许双重格式?

iOS Core Data NSFetchRequest groupby 关系对象

无法转换'NSFetchRequest类型的值 '到指定类型'NSFetchRequest “