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"]];
第三,由于不需要返回对象,只需要返回一个计数,因此也应该将执行forexecuteFetchRequest:error:
替换为countForFetchRequest:error:
。根据苹果公司的说法,它
返回给定提取请求将具有的对象数
如果已将其传递给executeFetchRequest,则返回:错误:
最后,在for
循环中,您每次都在执行一个请求。我的建议是在循环之前执行一个请求,然后检查其中的结果。据报道。在这种情况下,模式将强制您为您的实体设置GUID
显然,这些只是暗示。找到问题的真正方法是调试。此外,我将从一个全新的环境开始执行测试,即应用程序已从模拟器或设备中删除。dataArray不是由15个字典组成的列表,每个字典都有一个特定的标题吗?fetchArray似乎与dataArray完全无关,除了将当前字典插入缓存在将数据插入缓存之前,我使用fetchArray检查插入的数据是否已经存在。然后,您似乎应该检查fetchArray==0,而不是抱歉,这是一个错误,但是退货数量仍然是错误的。您更正后的退货数量是多少?您是否清除了缓存,它可能有重复。我更改了代码,但返回计数仍然不相同
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@",dictionary[@"title"]];