给定一个NSManagedObject子类的布尔属性删除(这是用两种不同的方式用下面的代码演示,因为两种方法都不工作):
代码清单1]
@interface MyManagedObject:NSManagedObject @property保留)NSNumber * deleted; //或@property(nonatomic)BOOL deleted;创建并插入到Core Data中的 @end
[代码清单2]
元数据.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO;并提取
代码清单3]
//设置实体描述 NSEntityDescription * entityDescription = [self entityDescription]; //设置排序器 NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@createdAtascending:YES]; NSSortDescriptor * sortDescriptorSection = [[NSSortDescriptor alloc] initWithKey:@myManagedObject.category.titleascending:YES]; //构建请求 NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorSection,sortDescriptor,nil]]; [request setPredicate:[NSPredicate predicateWithFormat:@deleted ==%@,[NSNumber numberWithBool:NO]]]; //获取请求 NSArray * items = [[self managedObjectContext] executeFetchRequest:request error:nil];返回items数组中的一个项目。
MyManagedObject * myManagedObject; //假设已初始化 myManagedObject.deleted = [NSNumber numberWithBool:YES]; // myManagedObject.deleted = YES; //在调试器中打印myManagedObject的描述显示deleted = 0在这一点 [myManagedObject.managedObjectContext save:nil]; //在调试器中打印myManagedObject的描述仍然显示deleted = 0在这一点 BOOL testValue = myManagedObject.deleted; if(testValue){ NSLog(@value updated); //此行被执行}重新执行代码清单3仍然会产生一个项目在items数组中,即使在NSFetchResultsController观察数据库已触发更新之后。如果应用程序被终止并重新启动,重新执行代码清单3不会在项目NSArray中产生任何项目。
解决方案数据属性已删除与 NSManagedObject 的 isDeleted 属性冲突。
比较核心数据NSPredicate predicateWithBlock和predicateWithFormat在父子上下文用于类似问题和一些实验。
Btw。调用属性更新也会导致问题,比较不能请使用比较Magical Record中的日期的谓词。
Given an NSManagedObject subclass with a boolean property deleted (this is demonstrated in two different ways with code below since both approaches are not working):
[Code Listing 1]
@interface MyManagedObject : NSManagedObject @property (nonatomic, retain) NSNumber *deleted; // Or @property (nonatomic) BOOL deleted; @endcreated and inserted into Core Data as follows:
[Code Listing 2]
metadata.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO;and fetched
[Code Listing 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];returns one item in the items array as expected. The problem is when deleted is modified:
[Code Listing 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 }Re-executing code listing 3 still yields one item in the items array even after a NSFetchResultsController watching the database has fired an update. If the application is terminated and relaunched, re-executing code listing 3 yields no items in the items NSArray.
解决方案Calling a Core Data property "deleted" conflicts with the isDeleted property of NSManagedObject.
Compare Core Data NSPredicate predicateWithBlock and predicateWithFormat in Parent Child Context for a similar problem and some experiments.
Btw. calling a property "updated" causes also problems, compare Cannot use a predicate that compares dates in Magical Record.
更多推荐
Core数据布尔键值更改未反映在提取中
发布评论