创建核心数据实体期间的精神错乱

时间:2015-01-19 18:08:56

标签: ios macos cocoa core-data

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

我有一个这样的数组:

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

  }

在Format类中我有

+ (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 个答案:

答案 0 :(得分:2)

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

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