IOS Coredata检查属性是否存在

时间:2015-10-21 12:30:19

标签: ios objective-c core-data xml-parsing

我正在研究基于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];


}

1 个答案:

答案 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"你应该学习。