无序/有序上下文获取

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

【讨论】:

嗨,我想我把字母排序值误导了你们,这只是为了在获取结果后进行演示。我真正的问题是,我想保持用户输入顺序,而不需要在数据库中添加其他属性。谢谢你不原谅。

以上是关于无序/有序上下文获取的主要内容,如果未能解决你的问题,请参考以下文章

托管对象上下文和数据获取顺序

Markdown基本语法3:段落与换行

volatile如何保证可见性和有序性的?

redis知识点

使关系有序会导致“对无效对象的悬空引用”。使用上下文限制时出错

3D视觉识别案例:3D无序棒料抓取,阀体圆环上下料,电机定子上料