创建核心数据实体期间的疯狂

Insanity during the creation of a Core Data entity

我正在以编程方式填充核心数据实体。

我有一个这样的数组:

NSArray *formats = @[
                        @"6 x 5",
                        @"5.3 x 4.3",
                        @"4 x 3",
                        @"5 x 3.5",
...

现在我枚举它并填充实体

  for (int i=0; i<[formats count]; i++) {

    NSString *format = formats[i];
    Format *oneFormat = [Format formatWithString:format inManagedObjectContext:managedObjectContext];

    // ... bla bla

  }

格式里面class我有

+ (Format *)formatWithString:(NSString *)string inManagedObjectContext:(NSManagedObjectContext *)context
{

    Format *aFormat = nil;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:NSStringFromClass([self class])
                                 inManagedObjectContext:context];


    NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(name == %@)", string];

这就是问题所在。在 for 循环中的某个时刻,我有

format = @"5.3 x 4.3"

然后,执行这一行

    Format *oneFormat = [Format formatWithString:format inManagedObjectContext:managedObjectContext];

理论上,format = @"5.3 x 4.3"传递给Format formatWithString

问题是 Format formatWithString 收到以下字符串:@"4 x 3.5".

什么???一个方法被称为 @"5.3 x 4.3" 并接收 @"4 x 3.5"?

精彩的部分来了。如果我 po predicate 我看到

name == "5.3 x 4.3 cm"

这是正确的值。但是保存记录的时候,保存的值是错误的

这个 @"4 x 3.5" 是我很久以前在代码中使用的旧格式。这是一个错字。我从我的代码中删除了所有提及这种格式的内容。我已经检查了 10 次。没有@"4 x 3.5"了。

我删除了所有派生数据。每次我生成数据库时,它都包含这个 @"4 x 3.5" 不应该存在的条目。

是否有任何隐藏的核心数据缓存或一些我可以清理以正确生成的地方?如何使用一个值调用方法并接收另一个值?

  1. 我怀疑您在重置所有内容时并没有删除 SQLite 文件。如果您在 iOS 上,那么它将在模拟器或设备上。从 device/sim 中删除应用程序也可以。如果您在 OS X 上,则找到 SQLite 文件的存储位置并将其删除。

  2. 像这样进行 update/insert 查询非常昂贵。我建议对您需要做出决定的所有对象执行一次提取。否则你的表现会很糟糕。