核心数据中的整数属性显示不同

时间:2014-05-14 07:43:55

标签: ios core-data

在我的核心数据实体中,有一个名为validity的Integer 32类型的属性。

先前使用此方法创建了两个对象:

- (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 14:55:15.939 SGRecencyMonitor [3086:70b] viewDidLoad.monitorItemArray [1] .validity:1442

如图所示,该值应为90而不是1442.但是,检查下面的cellForRowAtIndexPath方法会返回正确的结果:

- (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 SGRecencyMonitor [3086:70b] ItemViewController tableview cellForRowAtIndexPath有效期: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;
    }
}

我做错了什么?谢谢

2 个答案:

答案 0 :(得分:1)

在第一个实例中,您使用%d作为格式说明符 - 这需要一个整数,但是您传递NSNumber这是一个对象。您正在查看对象内存地址的整数。在第二个实例中,您使用%@,它需要一个对象,并且您正在查看NSNumber description方法的结果,只打印出数字值。

将第一个格式说明符更改为%@或从数字对象传递integerValue

答案 1 :(得分:0)

试试这个:

- (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