我目前有一个SQLite支持的核心数据应用程序,我在其中获取按firstName和lastName排序的记录。
问题是我有一些像(John Doe)
这样的名字,它们会回到列表的顶部,看起来默认的排序行为是按照ASCII排序顺序完成的。
是否有强迫这些记录显示在Z
之后?
我已阅读有关自定义排序描述符的内容,但它们似乎不起作用,因为Core Data会依赖SQLite进行排序。
更新
以下是我的数据现在的样本列表
(Abe Simpson)
(Bob Dole)
(Chris Rock)
Alan West
Brian Regan
我希望它看起来像什么
Alan West
Brian Regan
(Abe Simpson)
(Bob Dole)
(Chris Rock)
答案 0 :(得分:4)
添加名为parenthesized
的新BOOL属性,然后添加...
- (void)setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveName:name];
[self didChangeValueForKey:@"name"];
self.parenthesized = ([name hasPrefix:@"("] &&
[name hasSuffix:@")"]);
}
当你进行获取时:
[fetchRequest setSortDescriptors:
[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"parenthesized" ascending:NO],
[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES],
nil]];
答案 1 :(得分:1)
括号的原因是什么?如果你用一个单独的属性中的显式信息替换这个隐含信息,然后可以用来指导排序,你可能会让自己更容易。
答案 2 :(得分:0)
阅读SQLite中的自定义归类。但是,您可能无法在i设备上访问它们。
答案 3 :(得分:0)
我认为有一个非常简单的答案/解决方案。这适用于我本地(不适用于iPhone)。
order by replace(firstName, '(','')
回顾完帖子后,你希望它们位于最底层。以上将对它们进行排序,就好像括号被忽略一样。下面会得到你想要的输出(虽然看起来有点hackish)。
order by replace(firstName, '(','ZZZ')
答案 4 :(得分:0)
当你进行核心数据获取时,你得到一个数组,使用 - (void)sortUsingSelector:(SEL)比较器对数组进行排序 方法。然后,您可以编写自己的排序方法,如果元素较早,则返回NSOrderAscending,如果稍后则返回NSOrderDescending,如果相同,则返回NSOrderSame。