核心数据(SQLite支持)自定义字符串排序

时间:2010-12-08 23:10:16

标签: iphone ipad core-data

我目前有一个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)

5 个答案:

答案 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。