2014-05-14 14 views
0

在我的核心數據實體中,存在Integer 32類型名爲validity的屬性。核心數據中的整數屬性以不同的形式出現

有使用這種方法之前創建兩個對象:

- (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年5月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年5月14日14:55:15.948 SGRecencyMonitor [3086:70B] ItemViewController的tableview的cellForRowAtIndexPath:90

可有人請向我解釋爲什麼我不能使用[self.monitorItemArray [1] valueForKey:@「validity」]得到正確的結果我正在使用此方法將對象self.monitorItemArray傳遞給另一個視圖。我無法通過它檢索正確的值。以下是賽格方法

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

我做了什麼錯了?謝謝

+0

如果你想'int'它應該是'[(NSNumber *)[self.monitorItemArray [1] valueForKey:@「validity」] intValue]'。在你的檢查應該是'[(NSNumber *)[self.monitorItemArray [1] valueForKey:@「validity」] stringValue]'但似乎由於某種原因NSNumber隱式轉換爲NSString – kaman

回答

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 
+0

謝謝nmh,kaman和jrturton。現在解決了它。 – Sharkfin

+0

@BusDriver:如果其中一個提供的答案幫助你解決了問題,那麼你應該接受它作爲答案。 –

+0

是的。卡曼指出了我的理解錯誤。 Jrturton向我展示了格式中的錯誤。 nmh向我展示瞭如何和我在編碼中採用它。感謝你們。請原諒我的無知。 – Sharkfin

1

在你使用%d作爲格式說明符的第一個實例 - 這要求整數,但你傳遞一個NSNumber,這是一個對象。你看到對象的內存地址的整數。在第二種情況下,您使用的是%@,它需要一個對象,並且您會看到NSNumberdescription方法的結果,該方法僅打印出數字值。

將第一個格式說明符更改爲%@或從數字對象中傳入integerValue