核心数据批处理故障是否会保留排序?

时间:2013-03-21 17:16:24

标签: core-data

我有一些对象,我需要以一种我无法用排序描述符表达的方式进行排序(它涉及树中的位置)。目前我正在将它们排序为后台线程,收集它们的objectID,然后将它们返回到主上下文中,如下所示:

for (NSManagedObjectID *objectID in objectIDs)
{
    NSManagedObject *managedObject = [mainContext existingObjectWithID:objectID error:outError];
    if (!managedObject) return nil;
    [array addObject:managedObject];
}

这涉及很多数据库命中,所以我更愿意一次性完成。 Core Data Programming Guide建议使用这样的谓词:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[MyEntity entityName]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs];
NSArray *array = [mainContext executeFetchRequest:fetchRequest error:&error];

但是,我担心我会丢失排序,因为在其他地方他们使用@"SELF IN %@"并提供排序描述符。核心数据批处理错误是否会保留排序?

2 个答案:

答案 0 :(得分:1)

带谓词的抓取请求

[NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs]

以与对象ID存储在数组中相同的顺序返回对象。我做了一个小测试:

NSLog(@"%@", objectIDs);
// "0x102005370 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p5>",
// "0x102003700 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p4>",
// "0x1020036f0 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p1>"

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Question"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs];
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];
NSLog(@"%@", array);
// "<Question: 0x10201ae10> (entity: Question; id: 0x1020036f0 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p1> ; data: <fault>)",
// "<Question: 0x10201afe0> (entity: Question; id: 0x102003700 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p4> ; data: <fault>)",
// "<Question: 0x10201b060> (entity: Question; id: 0x102005370 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p5> ; data: <fault>)"

通过设置启动参数“-com.apple.CoreData.SQLDebug 3”,可以看出获取请求被转换为SQLite查询

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTEXT, t0.ZTITLE FROM ZQUESTION t0 WHERE  t0.Z_PK IN  (5,4,1)

将测试t0.Z_PK IN (5,4,1)应用于表中的所有行。因此,获取请求数组中对象的顺序不会影响返回对象的顺序。

答案 1 :(得分:0)

如果你想要超级确定,我只想创建一个'index'属性,并在将它们加载到该数组时将其添加到实体中。这样你就可以简单地将排序描述符设置为'index'并保证它能够正常工作。