核心数据布尔键值更改不反映在提取
给定一个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中产生任何项目。
调用核心数据属性“已删除”与NSManagedObject
的isDeleted
属性冲突。
比较核心数据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”来解决此问题。)
- 如何在iOS中退出程序时closuresUIManagedDocument
- 如何限制NSFetchRequest的结果数量?
- 好的教程或在IOS 7中使用Core.Data
- 魔法logging – 取主线程块ui,在后台返回nil
- 访问XCTestCase类中的应用程序委托对象导致misaligned_stack_error_ swift
- RestKit:为外键关系创build存根
- Swift核心数据不会永久存储数据
- 获取NSFetchedResultsController,NSSortDescription和sectionNameForKeyPath一起工作
- 使用fetchedresultcontroller为每个月设置一个不同的部分