我正在尝试设置一个值,然后使用Core Data返回它。这就是我现在正在做的事情:
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObject *newShot = [NSEntityDescription insertNewObjectForEntityForName:@"Shots" inManagedObjectContext:context];
NSString *newName= @"test";
[newShot setValue:newName forKey:@"shotNumber"];
NSError *error = nil;
[context save:&error];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Shots" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
NSLog(@"test : %@",items);
问题是当我想通过返回数组的NSLog来检查它是否正确存储数据时,这就是我得到的:
<NSManagedObject: 0x5bbbe10> (entity: Shots; id: 0x5b02b50 <x-coredata://F61F56A7-6A74-42AF-B565-6F9E091DA5F3/Shots/p14> ; data: <fault>)
在2个答案之后,这就是我正在使用的:
int size = [items count];
NSLog(@"array count is %d ",size);
if (size > 0) {
NSManagedObject *mo = [items objectAtIndex:0]; // assuming that array is not empty
NSString *value = [[mo valueForKey:@"shotNumber"] stringValue];
NSLog("Value : %@",value);
}
只是遇到这个小问题:
警告:从不兼容的指针类型传递'NSLog'的参数1
如何记录[mo valueForKey:@"shotNumber"]
?
答案 0 :(得分:1)
这是有效和正确的。因为你没有查询它的任何属性或关系,所以它没有出错。你可以在索引0处询问对象(如果结果数组不为空),它的-valueForKey:@“shotNumber”或强制通过将获取请求的-setReturnsObjectsAsFaults:设置为NO(默认情况下为YES)来进行故障。
答案 1 :(得分:1)
“故障”只是尚未加载的对象。核心数据使用故障来提高性能。 Core Data不是立即加载对象的数据,而是表示具有错误的数据,并且只在您尝试访问数据时检索数据。您的日志消息只是说Core Data尚未为您的Shot
对象加载任何数据。尝试访问Shot
对象的某些属性,看看会发生什么。
要解决第二个问题,您在NSLog
语句中的第一个双引号之前省略了@。它应该是:
NSLog(@"Value : %@", value);
答案 2 :(得分:0)
Protip:右键单击NSLog
和“跳转到定义”。如果可用,则转到定义(即源文件),如果找不到定义,则转到声明(即头文件)。标题会告诉你它的期望。
NSLog需要一个NSString *格式字符串(即NSLog(@"Foo: %@", bar)
)。