【问题标题】:IOS Coredata check if attribute is exist or notIOS Coredata检查属性是否存在
【发布时间】:2016-01-20 10:53:35
【问题描述】:

我正在研究基于 coredata 和基于 XML 解析[RSS Feed] 的项目。我必须检查 coredata 中的属性值是否可用?

例如:-

我的数据模型中有 3 个属性。 名称、网站名称和 feedurl。 现在我必须用用户的输入来解析 url。但在解析时,我想检查 URLNAME 是否在 coredata 中可用。如果可用,则解析将在不插入 coredata 的情况下完成,如果 URL 不在 coredata 中,则将其插入 coredata。

这是我可以在核心数据中插入 url 的尝试。但使用这种方法,同样的 url 也会进入 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];


}

【问题讨论】:

  • 我不确定我是否理解你的问题。您想在插入之前检查一个项目是否已经存在?
  • @SnowMax 完全正确。你理解正确。

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


【解决方案1】:

如果你想阻止一个已经存在的对象被插入,你有两个基本的选择。

首先是检查它是否存在,如果它不在数据库中,则只创建新的eject。

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“核心数据性能”演示中有一个很好的实施“更新或插入”示例,您应该学习。

【讨论】:

  • 非常感谢重播。我试着按照你说的执行。我还想设置,如果 url 为 nil,则限制添加到 coredata 中,因为有时 nil 数据会进入 coredata 。谢谢。
猜你喜欢
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多