Ios 从NSFetchRequest返回的数组计数错误

Ios 从NSFetchRequest返回的数组计数错误,ios,objective-c,core-data,nsfetchrequest,Ios,Objective C,Core Data,Nsfetchrequest,我正在使用核心数据缓存数据,下面是插入对象的代码: //data array count is 15 for (NSDictionary *dictionary in dataArray) { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"CacheData" inManagedO

我正在使用核心数据缓存数据,下面是插入对象的代码:

//data array count is 15
for (NSDictionary *dictionary in dataArray)
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CacheData" inManagedObjectContext:context];
    [request setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title LIKE '%@'",dictionary[@"title"]];
    [request setPredicate:predicate];
    NSArray *fetchArray = [context executeFetchRequest:request error:NULL];

    if ([fetchArray count] == 0)
    {
        CacheData *cacheData = [NSEntityDescription insertNewObjectForEntityForName:@"CacheData" inManagedObjectContext:context];
        [cacheData setTitle:dictionary[@"title"]];
        [cacheData setLink:dictionary[@"link"]];
        [cacheData setPublishDate:dictionary[@"pubDate"]];

        NSError *insertError = nil;
        if (![context save:&insertError])
        {
            return NO;
        }
    }
}
数据数组的计数是15,所以我应该在核心数据中插入15项。 但当我使用
NSFetchRequest
提取项目时,返回的数组计数增加了1,变成了16,再次提取项目时,它又增加了1到17:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CacheData" inManagedObjectContext:[[CacheDataManagement sharedInstance] managedObjectContext]];
[request setEntity:entity];
NSArray *fetchArray = [[[CacheDataManagement sharedInstance] managedObjectContext] executeFetchRequest:request error:NULL];
for (CacheData *data in fetchArray) {
    NSLog(@"fetch:%@",[data title]);
}

NSLog(@"%ld",[fetchArray count]);  //fetch array count is 16
我的代码有问题吗

更新


将代码中的
if([fetchArray count]!=0){…}
更改为
if([fetchArray count]==0){…}

[fetchArray count]!=0检查插入数据是否已存在。试着像这样改变它

if ([fetchArray count] == 0)
{
     CacheData *cacheData = [NSEntityDescription insertNewObjectForEntityForName:@"CacheData" inManagedObjectContext:context];
     [cacheData setTitle:dictionary[@"title"]];
     [cacheData setLink:dictionary[@"link"]];
     [cacheData setPublishDate:dictionary[@"pubDate"]];

     NSError *insertError = nil;
     if (![context save:&insertError])
     {
         return NO;
     }
}

由于这个问题我不太清楚(我想了解更多细节),我将尝试给你一些提示

首先,
save
应该在
for
循环的外部执行(此外,在循环中执行
返回
是不正确的)

第二,要检查是否存在重复的谓词,您应该依赖于,但是如果没有,谓词应该如下所示

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@",dictionary[@"title"]];
第三,由于不需要返回对象,只需要返回一个计数,因此也应该将执行for
executeFetchRequest:error:
替换为
countForFetchRequest:error:
。根据苹果公司的说法,它

返回给定提取请求将具有的对象数 如果已将其传递给executeFetchRequest,则返回:错误:

最后,在
for
循环中,您每次都在执行一个请求。我的建议是在循环之前执行一个请求,然后检查其中的结果。据报道。在这种情况下,模式将强制您为您的实体设置GUID


显然,这些只是暗示。找到问题的真正方法是调试。此外,我将从一个全新的环境开始执行测试,即应用程序已从模拟器或设备中删除。

dataArray不是由15个字典组成的列表,每个字典都有一个特定的标题吗?fetchArray似乎与dataArray完全无关,除了将当前字典插入缓存在将数据插入缓存之前,我使用fetchArray检查插入的数据是否已经存在。然后,您似乎应该检查fetchArray==0,而不是抱歉,这是一个错误,但是退货数量仍然是错误的。您更正后的退货数量是多少?您是否清除了缓存,它可能有重复。我更改了代码,但返回计数仍然不相同
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@",dictionary[@"title"]];