0

给定一个删除了布尔属性的 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 中产生任何项目。

4

3 回答 3

2

调用 Core Data 属性“已删除”isDeletedNSManagedObject.

比较核心数据 NSPredicate "deleted == NO"对于类似的问题和一些实验没有按预期工作。

顺便提一句。调用属性“更新”也会导致问题, compare不能使用比较 Magical Record 中日期的谓词

于 2013-08-07T16:36:44.250 回答
0

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

此外,deleted 是 NSNumber,而不是 BOOL。因此,当您使用时:

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

您正在测试 myManagedObject 的 deleted 属性是否为 nil。如果有一个值(甚至 [NSNumber numberWithBool:YES]),testValue 将为真。

在不相关的说明中,我还建议在调用 NSManagedObjectContext 的保存方法时捕获并记录错误。

于 2013-08-07T16:31:43.037 回答
0

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

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

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

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

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

于 2015-10-13T21:54:33.143 回答