我总是从 CoreData 获取 NSArray 吗?
Posted
技术标签:
【中文标题】我总是从 CoreData 获取 NSArray 吗?【英文标题】:Do I always fetch into a NSArray from CoreData? 【发布时间】:2013-06-07 10:35:26 【问题描述】:我正在从CoreData
获取一些东西,我期望1 result
或nil
。
目前我将 fetch 设置为 NSArray
并尝试将其提取到 IconRoutine*
对象中,但 [context executeFetchRequest:fetchIcon error:&error];
需要提取到数组中,因此在我尝试时导致崩溃。
我想我想知道我是否可以通过另一种方式获取entity object
,这样我就不需要if ( [Icon count] !=0 )
来检查nil
,我可以返回获取的任何内容并处理nil entity
在另一种方法中。
或者也许只是一种更有效的方式(如果有的话)来处理您期望1
或nil
的结果。
- (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) 获取保存的对象
如何为 CoreData 中包含 NSArray 的二进制数据创建 NSPredicate?