0

我无法理解为什么在执行 executeFetchRequest 后分配给数组对象的值会变得“无序”。好吧,我不确定获取是这里的问题。这是代码。

objects=[NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",nil];

NSManagedObject *DB = nil;

for (int i=0;i<[objects count];i++){

DB = [NSEntityDescription                   
                insertNewObjectForEntityForName:@"dbTable" 
                inManagedObjectContext:context];

[DB setValue:[objects objectAtIndex:i] forKey:@"item"];
[DB setValue:[NSString stringWithFormat:@"%3.2f", 0] forKey:@"value"];       
}

objects = [context executeFetchRequest:request error:&error];

印刷品

获取执行到数组对象
索引 0 :: 项目: d
索引 1 :: 项目: c
索引 2 :: 项目: e
索引 3 :: 项目: b
索引 4 :: 项目: a

谢谢你。

4

3 回答 3

2

由于底层数据库架构,Core Data 以无序的方式存储所有对象和多引用。正如 Alex 所描述的,除非您应用 NSSortDescriptor,否则无法保证您从 fetch 请求中返回的顺序。 Cocoa 邮件列表中的这个线程详细介绍了所涉及的问题以及一些潜在的解决方案。

这些解决方案包括在执行获取请求时对索引属性进行排序,或者实现托管对象的链接列表并按顺序遍历它。Brian Webster 创建了一个 NSManagedObject 的子类,它允许您在 Core Data 对象中维护有序的多对多关系,其源代码可以在这里找到。

于 2009-10-15T22:04:48.413 回答
1

将 anNSSortDescriptor应用于您的获取请求,例如:

NSSortDescriptor *itemDescriptor = [[NSSortDescriptor alloc] initWithKey:@"item" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:itemDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[itemDescriptor release];

将按item名称排序。你可以使用value, 代替。

于 2009-10-15T13:17:07.153 回答
0

当您执行 fetch 请求但未指定您希望您的项目按特定键排序时,您会得到一个未排序的结果数组。您可以使用如下代码片段使用排序描述符扩展您的 fetch 请求。

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];
    [sortDescriptor release];
    [sortDescriptors release];
于 2009-10-15T13:13:01.293 回答