Ios 核心数据中的整数属性显示方式不同
在我的核心数据实体中,有一个名为validity的整型32属性 前面使用此方法创建了两个对象:Ios 核心数据中的整数属性显示方式不同,ios,core-data,Ios,Core Data,在我的核心数据实体中,有一个名为validity的整型32属性 前面使用此方法创建了两个对象: - (void) AddMandatoryItems { NSManagedObjectContext *context = [self managedObjectContext]; NSManagedObject *newMonitorItem = [NSEntityDescription insertNe
- (void) AddMandatoryItems
{
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newMonitorItem = [NSEntityDescription
insertNewObjectForEntityForName:@"MonitorItem"
inManagedObjectContext:context];
//
// Other codes here
//
[newMonitorItem setValue:[NSNumber numberWithInt:35]
forKey:@"validity"];
[self.monitorItemArray addObject:newMonitorItem];
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
//
// other codes here
//
[newMonitorItem setValue:[NSNumber numberWithInt:90]
forKey:@"validity"];
[self.monitorItemArray addObject:newMonitorItem];
if (![context save:&error])
{
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
// Return the number of rows in the section.
}
第一个和第二个对象的有效值分别为35和90
这两个值的加载方式如下:
- (void)viewDidLoad
{
//
// Other codes here
//
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MonitorItem"];
self.monitorItemArray = [[managedObjectContext
executeFetchRequest:fetchRequest
error:nil] mutableCopy];
NSLog(@"viewDidLoad.monitorItemArray[1].validity: %d", (int)[self.monitorItemArray[1] valueForKey:@"validity"]);
}
NSLog的结果如下所示:
2014-05-14:55:15.939 SGReceincyMonitor[3086:70b]viewDidLoad.monitorItemArray[1]。有效期:1442
如图所示,该值应为90,而不是1442。但是,检查下面的CellForRowatineXpath方法会返回正确的结果:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSManagedObject *monitorItem = [self.monitorItemArray objectAtIndex:indexPath.row];
//
// code to display each row here
//
NSLog(@"ItemViewController tableview cellForRowAtIndexPath Validity: %@", [monitorItem valueForKey:@"validity"]);
return cell;
}
结果如下:
2014-05-14 14:55:15.948 SGReceincyMonitor[3086:70b]项目视图控制器表格视图单元格行索引路径有效性:90
有人能解释一下为什么我无法使用[self.monitorItemArray[1]valueForKey:@“validity”]获得正确的结果吗?我正在使用此方法将对象self.monitorItemArray传递给另一个视图。我无法通过它检索正确的值。下面是segue方法
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"UpdateView"])
{
NSManagedObject *selectedItem = [self.monitorItemArray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
ItemUpdateViewController *destViewController = segue.destinationViewController;
destViewController.ItemReceived = selectedItem;
}
}
我做错了什么?谢谢试试这个:
- (void)viewDidLoad
{
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MonitorItem"];
self.monitorItemArray = [[managedObjectContext
executeFetchRequest:fetchRequest
error:nil] mutableCopy];
NSNumber *n = [self.monitorItemArray[1] valueForKey:@"validity"];
NSLog(@"viewDidLoad.monitorItemArray[1].validity: %d", [n intValue]);
}
// it works for me
在第一个实例中,您使用
%d
作为格式说明符-这需要一个整数,但您传递给它一个NSNumber
,它是一个对象。您将看到对象内存地址的整数。在第二个实例中,您使用的是%@
,它需要一个对象,您看到的是NSNumber
的description
方法的结果,该方法只打印出数值
将第一个格式说明符更改为
%@
,或者从number对象传入integerValue
如果您想要int
它应该是[(NSNumber*)[self.monitoriemrarray[1]valueForKey:@“validity”]intValue]
。在您的检查中,它应该是[(NSNumber*)[self.monitoriemrarray[1]valueForKey:@“validity”]stringValue]
,但似乎出于某种原因,NSNumber强制转换为NSStringimplicitly@BusDriver:如果提供的答案中有一个帮助您解决了问题,那么您应该接受它作为答案。是。卡曼指出了我在理解上的错误。jrturton以格式向我显示错误。nmh向我演示了如何使用它,我也在我的编码中采用了它。谢谢你们。请原谅我的无知。