核心数据布尔键值更改不反映在提取

给定一个NSManagedObject子类,删除一个布尔属性(这是用两种不同的方式用下面的代码演示的,因为这两种方法都不起作用):

[代码1]

@interface MyManagedObject : NSManagedObject @property (nonatomic, retain) NSNumber *deleted; // Or @property (nonatomic) BOOL deleted; @end 

创build并插入到Core Data中,如下所示:

[代码2]

 metadata.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO; 

并提取

[代码3]

 // setup entity description NSEntityDescription* entityDescription = [self entityDescription]; // setup the sorter NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; NSSortDescriptor* sortDescriptorSection = [[NSSortDescriptor alloc] initWithKey:@"myManagedObject.category.title" ascending:YES]; // Build request NSFetchRequest* request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorSection, sortDescriptor, nil]]; [request setPredicate:[NSPredicate predicateWithFormat:@"deleted == %@", [NSNumber numberWithBool:NO]]]; // Fetch request NSArray* items = [[self managedObjectContext] executeFetchRequest:request error:nil]; 

按照预期返回items数组中的一个项目。 问题是当删除被修改时:

[代码4]

 MyManagedObject* myManagedObject; // Assume initialized myManagedObject.deleted = [NSNumber numberWithBool:YES]; // myManagedObject.deleted = YES; // Printing description of myManagedObject in debugger shows deleted = 0 at this point [myManagedObject.managedObjectContext save:nil]; // Printing description of myManagedObject in debugger still shows deleted = 0 at this point BOOL testValue = myManagedObject.deleted; if (testValue) { NSLog(@"value updated"); // This line is executed } 

即使在观察数据库的NSFetchResultsController激发了更新之后,重新执行代码清单3仍然会在items数组中产生一个项目。 如果应用程序被终止并重新启动,则重新执行代码清单3将不会在项目NSArray中产生任何项目。

调用核心数据属性“已删除”与NSManagedObjectisDeleted属性冲突。

比较核心数据NSPredicate“deleted == NO”对于类似的问题和一些实验没有预期的效果。

顺便说一句。 调用属性“更新”也会导致问题,比较不能使用比较魔术logging中的date的谓词 。

您不应该使用删除作为NSManagedObject子类的属性名称。

另外,删除是一个NSNumber,而不是BOOL。 所以,当你使用:

 BOOL testValue = myManagedObject.deleted; if (testValue) { NSLog(@"value updated"); // This line is executed } 

您正在testingmyManagedObject的已删除属性是否为零。 如果有值(即使[NSNumber numberWithBool:YES]),testValue将为true。

在不相关的说明中,我也build议在调用NSManagedObjectContext的save方法时捕获和logging错误。

请注意,这不仅仅是一个删除和isDeleted问题。 我写了一个数据库,我有一个“关系”属性,这是一个int16(几种关系types的select),但是我也有一个“isRelationship”布尔值,看着这个属性和其他几个来确定内容是关于个人或关于一个关系。 valueForKey:@“relationship”将返回isRelationship的bool – 这意味着它也影响了NSPredicate。 以下谓词:

 NSPredicate *pred = [NSPredicate predicateWithFormat:@"relationship IN %@", @[[NSNumber numberWithShort:Relationship_Dating], [NSNumber numberWithShort:Relationship_Married]]]; 

将无法滤除朋友或家庭关系,因为他们都是从isRelationship返回1而不是实际的关系值。

当涉及“是”的布尔值时,请注意愚蠢的“聪明的”系统行为。

(我通过将“ – (bool)isRelationship”方法更改为“ – (bool)isRelational”来解决此问题。)