我的核心数据模型中有一个实体,如下所示:
@interface Selection : NSManagedObject
@property (nonatomic, retain) NSString * book_id;
@property (nonatomic, retain) NSString * contenu;
@property (nonatomic, retain) NSNumber * page_id;
@property (nonatomic, retain) NSNumber * nbrOfOccurences;
@property (nonatomic, retain) NSString * next;
@property (nonatomic, retain) NSString * previous;
我已创建了许多Selection
并将其保存在Core Data中,现在我想删除一些带有某些条件的选项。例如,如果匹配以下内容,我想删除Selection
对象:
content = test
page_id = 5
book_id = 1331313
我怎么能这样做?
答案 0 :(得分:34)
Mike Weller 写的是对的。我会稍微扩展一下答案。
首先,您需要创建一个NSFetchRequest
,如下所示:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Selection" inManagedObjectContext:context]];
然后您必须为该请求设置谓词,如下所示:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"content == %@ AND page_id == %@ AND book_id == %@", contentVal, pageVal, bookVal]];
,其中
NSString* contentVal = @"test";
NSNumber* pageVal = [NSNumber numberWithInt:5];
NSString* bookVal = @"1331313";
我正在使用%@
,因为我假设你使用的是对象而不是标量值。
现在,您可以使用上一个请求在上下文中执行提取:
NSError* error = nil;
NSArray* results = [context executeFetchRequest:fetchRequest error:&error];
results
包含与该谓词匹配的所有托管对象。
最后,您可以抓取对象并对其进行删除。
[context deleteObject:currentObj];
完成后,您需要根据文档保存上下文。
正如在保存上下文之前新的对象未保存到商店一样,在保存上下文之前,不会从商店中删除已删除的对象。
因此
NSError* error = nil;
[context save:&error];
请注意save
方法返回bool值。因此,您可以使用如下方法或向用户显示警报。来源NSManagedObjectContext save error。
NSError *error = nil;
if ([context save:&error] == NO) {
NSAssert(NO, @"Save should not fail\n%@", [error localizedDescription]);
abort();
}
答案 1 :(得分:5)
您应该使用具有适当条件的NSPredicate
执行获取请求,然后使用结果集中的每个对象调用deleteObject:
上的NSManagedObjectContext
方法。
答案 2 :(得分:4)
除了Mike Weller和flexaddicted之外,在致电[context deleteObject:currentObj];
后,您需要save:
上下文:
NSError *error = nil;
[context save:&error];
从documentation开始:
正如在保存上下文之前新的对象未保存到商店一样,在保存上下文之前,不会从商店中删除已删除的对象。
这在我的案例中起了作用。