【发布时间】:2013-08-09 01:26:06
【问题描述】:
给定一个删除了布尔属性的 NSManagedObject 子类(这在下面的代码中以两种不同的方式演示,因为这两种方法都不起作用):
[代码清单 1]
@interface MyManagedObject : NSManagedObject
@property (nonatomic, retain) NSNumber *deleted;
// Or @property (nonatomic) BOOL deleted;
@end
创建并插入核心数据如下:
[代码清单 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 不会在 items NSArray 中产生任何项目。
【问题讨论】:
-
您的谓词引用“deleted”,但您的属性名为“deleted1”和“deleted2”。基于重新启动后它的行为不同的事实,我认为这是一个错字。
-
“deleted”、“deleted1”、“deleted2”是不同的属性吗?那你怎么能指望修改“deleted1”或“deleted2”对“deleted”有影响呢? - 或者“deleted1/deleted2”只是使用“deleted”的各种方法的占位符?然后它是stackoverflow.com/questions/16283252/… 的副本:您不应将 Core Data 属性称为“已删除”。
-
deleted1 和 deleted2 是我避免将两组代码清单放在一起的方法,这些代码清单将属性同时作为 NSNumber 和 BOOL。显然,我不知道命名一个已删除的变量与修改如何生效有任何关系。
-
顺便说一句:这不是重复的,因为虽然解决方案相同,但症状不同(值更改不生效,而不是调用了错误的更新方法)。因此,有此问题的人在搜索时不会找到其他问题。 @MartinR,请随时发表您的评论作为答案,我很乐意接受。
-
在谓词中使用 BOOL 时,只需执行 @"!deleted" 或 @"deleted" 而不是 @"deleted == something"。
标签: ios objective-c core-data