无序/有序上下文获取

时间:2009-10-15 11:28:09

标签: iphone objective-c core-data nsarray nsfetchrequest

我无法理解为什么在执行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];

裴安平

在将执行执行到数组对象之后

新的错误排序
index 0 :: Item:d
index 1 :: Item:c
index 2 :: Item:e
index 3 :: Item:b
index 4 :: Item:a

谢谢。

3 个答案:

答案 0 :(得分:2)

由于底层数据库体系结构,Core Data以无序方式存储所有对象和多对象引用。除非您按照Alex描述的方式应用NSSortDescriptor,否则无法保证从获取请求返回的顺序。 Cocoa邮件列表中的This thread详细说明了所涉及的问题以及一些可能的解决方案。

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

答案 1 :(得分:1)

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

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

将对item名称进行排序。您可以改用value

答案 2 :(得分:0)

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

    // 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];