我总是从 CoreData 获取 NSArray 吗?

Posted

技术标签:

【中文标题】我总是从 CoreData 获取 NSArray 吗?【英文标题】:Do I always fetch into a NSArray from CoreData? 【发布时间】:2013-06-07 10:35:26 【问题描述】:

我正在从CoreData 获取一些东西,我期望1 resultnil

目前我将 fetch 设置为 NSArray 并尝试将其提取到 IconRoutine* 对象中,但 [context executeFetchRequest:fetchIcon error:&error]; 需要提取到数组中,因此在我尝试时导致崩溃。

我想我想知道我是否可以通过另一种方式获取entity object,这样我就不需要if ( [Icon count] !=0 ) 来检查nil,我可以返回获取的任何内容并处理nil entity 在另一种方法中。

或者也许只是一种更有效的方式(如果有的话)来处理您期望1nil 的结果。

- (IconRoutine *) getIconRoutine 

    NSFetchRequest *fetchIcon = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityItem = [NSEntityDescription entityForName:@"IconRoutine" inManagedObjectContext:context];
    [fetchIcon setEntity:entityItem];

    [fetchIcon setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"User",@"Routine", nil]];

    [fetchIcon setPredicate:[NSPredicate predicateWithFormat:@"(routine.routineName == %@) AND (user.email LIKE %@) AND (author LIKE %@)",_routineNameInput.text,_appDelegate.currentUser,_routineAuthor]];

    NSError *error = nil;
    NSArray* Icon = [context executeFetchRequest:fetchIcon error:&error];

    if ( [Icon count] !=0 ) 
        return Icon[0];
    
    return NO;    

【问题讨论】:

恐怕这就是 Core Data 的工作方式。你总是取到一个数组中。 请注意,返回值nil 表示“错误”,而空数组表示“无结果”。 您能解释一下您想要实现的目标吗? getIconRoutine 返回 IconRoutine 而不是布尔值。谢谢。 崩溃的原因是什么?添加一些细节... @flexaddicted 他想返回 IconRoutine 对象,如果它存在,否则返回 nil(我相信他只是使用 NO 而不是 nil)。 【参考方案1】:

这是一个选项。不一定是您正在寻找的解决方案,但可能会有所帮助:

- (IconRoutine *) getIconRoutine 

    NSFetchRequest *fetchIcon = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityItem = [NSEntityDescription entityForName:@"IconRoutine" inManagedObjectContext:context];
    [fetchIcon setEntity:entityItem];

    [fetchIcon setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"User",@"Routine", nil]];

    [fetchIcon setPredicate:[NSPredicate predicateWithFormat:@"(routine.routineName == %@) AND (user.email LIKE %@) AND (author LIKE %@)",_routineNameInput.text,_appDelegate.currentUser,_routineAuthor]];

    return [context executeFetchRequest:fetchIcon error:nil].lastObject;    

这显然只有在您不关心错误消息时才有效。如果 NSArray 为 nil 或数组为空,lastObject 将返回 nil(所以永远不会出现 indexOutOfBoundsException)!否则,它会返回最后一个对象,如果只有一个,它只会返回那个。

如果您确实关心错误,您可以简单地这样做:

- (IconRoutine *) getIconRoutine 

    // fetch code from above
    // ..    

    NSError *fetchError
    IconRoutine *result = [context executeFetchRequest:fetchIcon error:&fetchError].lastObject;

    if (fetchError) 
        // handle the error
    

    // return whatever result is anyway because if there was an error it would already be nil, and if not then it is the object you are looking for
    return result;

希望这会有所帮助!

【讨论】:

以上是关于我总是从 CoreData 获取 NSArray 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中对来自 Core Data 的实体的 NSArray 进行快速枚举时出现运行时错误

CoreData(MagicalRecord) 获取保存的对象

核心数据可转换属性(NSArray)为空

如何为 CoreData 中包含 NSArray 的二进制数据创建 NSPredicate?

IOS/Objective-C:无法将 CoreData 值保存到 NSArray

Swift:如何避免 CoreData 中的重复条目以使用 JSON 数组实现?