Iphone 核心数据(SQLite支持)字符串的自定义排序
我目前有一个SQLite支持的核心数据应用程序,在这个应用程序中,我将获取按firstName和lastName排序的记录 问题是我有一些名字,比如Iphone 核心数据(SQLite支持)字符串的自定义排序,iphone,ipad,core-data,Iphone,Ipad,Core Data,我目前有一个SQLite支持的核心数据应用程序,在这个应用程序中,我将获取按firstName和lastName排序的记录 问题是我有一些名字,比如(John Doe),它们又回到了列表的顶部,似乎默认的排序行为是按ASCII排序顺序完成的 是否有任何方法强制这些记录在Z之后显示 我读过关于自定义排序描述符的文章,但它们似乎不起作用,因为核心数据依靠SQLite进行排序 更新 下面是我的数据现在的示例列表 (Abe Simpson) (Bob Dole) (Chris Rock) Alan We
(John Doe)
,它们又回到了列表的顶部,似乎默认的排序行为是按ASCII排序顺序完成的
是否有任何方法强制这些记录在Z
之后显示
我读过关于自定义排序描述符的文章,但它们似乎不起作用,因为核心数据依靠SQLite进行排序
更新
下面是我的数据现在的示例列表
(Abe Simpson)
(Bob Dole)
(Chris Rock)
Alan West
Brian Regan
我希望它看起来像什么
Alan West
Brian Regan
(Abe Simpson)
(Bob Dole)
(Chris Rock)
阅读SQLite中的自定义排序规则。不过,您可能无法在i-devices上访问它们。插入括号的原因是什么?如果在一个单独的属性中用显式信息替换此隐式信息,然后该属性可用于指导排序,那么您可能会使事情变得更容易。添加一个新的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]];
我认为有一个非常简单的答案/解决方案。这对我来说是本地的(不是iPhone)
在阅读完你的文章后,你希望他们在底部。上面的内容将对它们进行排序,就好像忽略了括号一样。下面将得到您想要的输出(尽管看起来有些粗糙)
在执行核心数据提取时,您将获得一个数组,使用-(void)sortUsingSelector:(SEL)comparator对数组进行排序
方法。然后,您可以编写自己的排序方法,如果元素较早,则返回nsorderscending;如果元素较晚,则返回nsorderscending;如果元素相同,则返回NSOrderSame。核心数据似乎不允许自定义排序您想要什么,需要在末尾强制放置一些记录,而不需要任何短基。我不认为这(John Doe)最终会在排序后出现在z之后。这是客户存储/分割部分数据的方式(不是一个好方法),这基本上是我无法控制的,尽管缺少他们不想要的括号。我想我可以在记录中添加某种标志,告诉它显示在列表的底部或其他地方…实际上Daniels solutions看起来不错,它提供了两种WorldsJSUGG的最佳功能,我不是直接使用SQL语句访问SQLite,我是使用核心数据来处理抓取。谢谢您的考虑啊,所以无法发送排序参数?不幸的是,不是这样,至少我不知道。我使用NSFetchedResultsController是为了提高效率,因为我有可能大量的记录。我无法将整个结果集加载到NSArray中并使用此排序方法。在这种情况下,可以选择停止使用NSFetchedResultsController,或者可能将这些元素拆分为另一个实体,我倾向于使用第一个实体,但在传递有关上下文更改的通知时必须非常小心。谢谢Daniel,这种方法非常适合我。如果括号中是一个BOOL集,在排序描述符中升序为YES,则在列表底部显示,这对以后查看此项的人来说是一个旁注。
order by replace(firstName, '(','')
order by replace(firstName, '(','ZZZ')