6

这真的让我很烦。在 Objective-C 中,我有一个Item带有布尔属性的实体Deleted。我希望能够将 的值设置Deleted为 YES 或 1。

这是我的代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSString *itemID = [[fetchedObjects objectAtIndex:(int)[currentTable selectedRow]] valueForKey:@"ItemID"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ItemID = %@", itemID];
[fetchRequest setPredicate:predicate];

NSError *error = nil;
Item *objectToDelete = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0];
if (objectToDelete == nil) {
    NSLog(@"ERROR");
}

[fetchRequest release];

[objectToDelete setValue:[NSNumber numberWithBool:YES] forKey:@"Deleted"];

[managedObjectContext save:&error];

需要注意的是,我能够成功更改不同的属性;例如:我将字符串 -DEL 添加到Item的属性CodeName. 当我查看数据表时,这些值的字符串会相应更新,但值Deleted仍然为 0。

4

1 回答 1

10

我强烈强烈建议为此属性使用不同的名称。NSManagedObject已经有与此名称密切相关的方法(特别是-isDeleted),这可能会导致与您的自定义属性名称发生冲突。正如文档NSPropertyDescription所说:

请注意,属性名称不能与 NSObject 或 NSManagedObject 的任何无参数方法名称相同。例如,您不能为属性命名为“description”。NSObject 上有数百个方法可能与属性名称冲突——而且这个列表可能会在没有来自框架或其他库的警告的情况下增长。您应该避免使用非常笼统的词(例如“字体”和“颜色”)以及与 Cocoa 范例重叠的词或短语(例如“isEditing”和“objectSpecifier”)。

如果您将属性名称更改为不太可能与任何其他属性/方法名称冲突的名称,您的代码是否有效?

于 2012-06-03T19:12:09.917 回答