【问题标题】:Core Data boolean key value change not reflected in fetchCore Data 布尔键值更改未反映在 fetch 中
【发布时间】: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


【解决方案1】:

调用 Core Data 属性“已删除”与 NSManagedObject 的 isDeleted 属性冲突。

比较Core Data NSPredicate "deleted == NO" does not work as expected 的类似问题和一些实验。

顺便说一句。调用属性“更新”也会导致问题,比较 Cannot use a predicate that compares dates in Magical Record。

【讨论】:

  • 有没有来自苹果的文件支持这一点?
  • @Keale:NSPropertyDescription Class Reference 的概述部分有一些说明。不幸的是,这些都非常模糊(“你应该避免使用非常笼统的词......”)
  • 哇,这确实很模糊。我认为避免这种情况的一个好方法是在属性之前或之后添加您独特的特殊符号以保证唯一性。无论如何感谢您的回复。
【解决方案2】:

您不应该使用 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 的保存方法时捕获并记录错误。

【讨论】:

    【解决方案3】:

    请注意,这不仅仅是已删除和 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”来解决此问题。)

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 2019-12-16
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2014-01-06
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多