无序/有序上下文获取
Posted
技术标签:
【中文标题】无序/有序上下文获取【英文标题】:disordered/ordered context fetching 【发布时间】:2009-10-15 11:28:09 【问题描述】:我无法理解为什么在执行 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
谢谢。
【问题讨论】:
【参考方案1】:由于底层数据库架构,Core Data 以无序的方式存储所有对象和多对引用。正如 Alex 所描述的,除非您应用 NSSortDescriptor,否则无法保证您从 fetch 请求中返回的顺序。 Cocoa 邮件列表中的This thread 详细介绍了所涉及的问题以及一些潜在的解决方案。
这些解决方案包括在执行获取请求时使用索引属性进行排序,或者实现托管对象的链接列表并按顺序遍历它。 Brian Webster 创建了一个 NSManagedObject 的子类,可以让您在 Core Data 对象中维护有序的多对多关系,其源代码可以在 here 找到。
【讨论】:
嗨布拉德,你和亚历克斯的 cmets 非常有启发性。 Brian Webster 子类化适用于多对多关系,而不是我的情况。我认为我的想法是记录用户输入订单的另一个属性。是的,不是一个复杂的,但证明是有效的。谢谢。【参考方案2】:将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
。
【讨论】:
嗨,Alex,我也遇到了这个想法(虽然不知道如何在 obj-c 中实现)。现在我知道怎么做了。但是我所追求的是将项目按照用户输入的确切顺序保留,并且在我的数据库中不使用另一个属性来接收输入顺序。那可能吗?感谢您的帮助。 除非用户以可用作自然排序的顺序输入项目(即输入的值可以按原样排序)我相当确定您需要使用另一个存储条目顺序的键,然后对其进行排序以进行提取。 我感觉到,在幕后,托管对象子类被放入NSSet
类型的包中。集合的成员没有特定的顺序,因为构造集合的唯一要求是成员是唯一的。提取是对从集合中读取的内容应用排序,假设将排序描述符添加到提取中。【参考方案3】:
当您执行 fetch 请求但未指定您希望您的项目按特定键排序时,您会得到一个未排序的结果数组。您可以使用如下代码 sn-p 使用排序描述符扩展您的 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];
【讨论】:
嗨,我想我把字母排序值误导了你们,这只是为了在获取结果后进行演示。我真正的问题是,我想保持用户输入顺序,而不需要在数据库中添加其他属性。谢谢你不原谅。以上是关于无序/有序上下文获取的主要内容,如果未能解决你的问题,请参考以下文章