我正在研究基于coredata和XML解析[RSS Feed]的项目。我必须检查在coredata中属性值是否可用?
例如: -
我的datamodel中有3个属性。 名称,网站名称和Feedurl。 现在我必须用用户的输入解析url。但在解析时我想检查是否 URLNAME 在coredata中可用。如果可用,那么解析将在不插入coredata的情况下完成,如果 URL 不在coredata中,那么它将被插入到coredata中。
这是我的尝试,我可以在核心数据中插入网址。但是使用这种方法,相同的网址也会进入coredata。
- (void)feedParserDidFinish:(MWFeedParser *)parser {
[HUD hide:YES];
//**Coredata inserting value**//
NSManagedObjectContext *context = [self managedObjectContext];
// Create a new managed object
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"I" inManagedObjectContext:context];
[newDevice setValue:self.Name forKey:@"name"];
[newDevice setValue:self.WebsiteName forKey:@"websitename"];
[newDevice setValue:self.Feedlink forKey:@"feedurl"];
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
//**Parsing url**//
NSLog(@"Finished Parsing%@", (parser.stopped ? @" (Stopped)" : @""));
NSArray* array =[parsedItems sortedArrayUsingDescriptors:
[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"date"
ascending:NO]]];
NSMutableDictionary* dict = [NSMutableDictionary new];
[dict setObject:chanelInfo forKey:@"title"];
[dict setObject:array forKey:@"data"];
[sectionheaders addObject:dict];
NSLog(@"SectionHeader Count:%ld",(long)sectionheaders.count);
[self updateTableWithParsedItems];
}
答案 0 :(得分:1)
如果您想要阻止某个对象插入,那么您有两个基本选项。
第一种方法是检查它是否存在,如果它不在数据库中,则只创建新的弹出。
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"I"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"feedurl = %@", self.Feedlink];
if ([[moc executeFetchRequest:fetchRequest error:NULL] count] == 0) {
// Create a new managed object
}
第二种是使用iOS9中引入的新的唯一约束。有关详细信息,请参阅WWDC 2015核心数据演示文稿。
请注意,如果你有很多对象,你可能应该允许你搜索的属性被编入索引,或者你最终会对每个对象进行线性搜索。
另外,如果您解析大量对象,最好一次搜索多个项目,和/或使用更好的算法。
WWDC 2013"核心数据性能"演示文稿有一个很好的例子来实现" update-or-insert"你应该学习。