10

我的核心数据模型中有一个实体,如下所示:

@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;

我已经创建了许多Selections 并将它们保存在 Core Data 中,现在我想删除一些带有某些标准的选择。Selection例如,如果匹配以下内容 ,我想删除一个对象:

content = test
page_id = 5
book_id = 1331313

我怎么能做到这一点?

4

3 回答 3

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";

我正在使用%@,因为我假设您使用的是对象而不是标量值。

现在,您在先前请求的上下文中执行 fetch:

NSError* error = nil;
NSArray* results = [context executeFetchRequest:fetchRequest error:&error];

results包含与该谓词匹配的所有托管对象。

最后,您可以抓取对象并对它们调用删除。

[context deleteObject:currentObj];

完成后,您需要根据文档保存上下文。

就像在保存上下文之前不会将新对象保存到存储中一样,在保存上下文之前不会从存储中删除已删除的对象。

因此

NSError* error = nil;
[context save:&error];

请注意,该save方法返回一个布尔值。因此,您可以使用如下方法或向用户显示警报。源NSManagedObjectContext 保存错误

NSError *error = nil;
if ([context save:&error] == NO) {
    NSAssert(NO, @"Save should not fail\n%@", [error localizedDescription]);
    abort();
}
于 2012-05-07T13:16:17.077 回答
5

您应该使用具有适当条件的 fetch 请求NSPredicate,然后对结果集中的每个对象调用该deleteObject:方法。NSManagedObjectContext

于 2012-05-07T12:49:22.347 回答
4

除了 Mike Weller 和 flexaddicted,调用后[context deleteObject:currentObj];你需要save:上下文:

NSError *error = nil;
[context save:&error];

文档

就像在保存上下文之前不会将新对象保存到存储中一样,在保存上下文之前不会从存储中删除已删除的对象。

这对我来说很重要。

于 2013-05-06T07:17:28.070 回答