为啥我不能更新核心数据实体属性的布尔值?

Posted

技术标签:

【中文标题】为啥我不能更新核心数据实体属性的布尔值?【英文标题】:Why can't I update the boolean value of my core data entity's attribute?为什么我不能更新核心数据实体属性的布尔值? 【发布时间】:2012-06-02 23:57:06 【问题描述】:

这真的让我很烦。在 Objective-C 中,我有一个带有布尔属性 DeletedItem 实体。我希望能够将 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。

【问题讨论】:

您的实体描述是什么样的?您是否使用本机整数类型?调用 valueForKey:@"Deleted" 得到什么 项目的我的实体头文件的 NSNumber * 已删除。在核心数据模型中,它被列为布尔值。当我在更改后调用 valueForKey:@"Deleted" 时,它会打印出“0”。 您的属性是否被声明为瞬态?然后,尝试在更新前后放一条日志语句。告诉我。 您确定您的属性名称以大写字母开头吗? Core Data 命名约定不允许这样做。再检查一遍。 我的属性没有描述为transient,实体名是Item,属性名是Deleted。属性名称是什么? 【参考方案1】:

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

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

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

【讨论】:

这就是诀窍。我将“Deleted”属性更改为“DeletedBoolean”。代码中的一些反射现在可以完美运行。非常感谢。 一个多小时我试图弄清楚为什么我不能将“deleted”属性设置为“1”,谢谢。

以上是关于为啥我不能更新核心数据实体属性的布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中将模型属性设置为布尔值

SwiftUI - 如何切换核心数据中的所有布尔值

为啥我存储在 Core Data 中的布尔值没有立即显示?

核心数据实体布尔属性未保存在表格单元格删除中

核心数据日期和布尔属性无法更新

为啥 <input type="hidden"> 不能接受来自服务器端的布尔值?