您应该能够使用NSManagedObjectContext 的deleteObject: 方法从数据库中删除对象。同样,如果您从核心数据模型创建了 .h 和 .m 文件,它应该为对象创建了从自身中删除一对多关系对象的方法(类似于 -(void)removeCustomersObject:(Customer *)value 或 -(void)removeCustomers:(NSSet *)value.
使用此信息,您应该能够设置一个参数来检查余额是否为零,并使用这些方法之一删除对象。一种可能性是偶尔使用获取请求来查找余额为零的所有客户(使用NSPredicate)并从数据库中删除获取的结果。我希望这会有所帮助,并让您知道去哪里。我本来会更详细,但如果没有更多信息,很难给出太多建议。无论如何,这应该为如何缓解您的问题提供一个很好的垫脚石。
编辑:有两种方法可以从核心数据中删除多个对象。最简单的是假设您有两个实体。一个是父母,我称之为MyDatabase,它将所有孩子保持在一对多的关系中。这些将是您的 Customer 或 Person 对象。你给它起什么名字并不重要,但那些是平衡的对象。对于这个例子,我将只调用类Customer。
如果您为实体生成代码(通过转到您的 xcdatamodeld 文件,选择实体,然后转到 Editor->Create NSManagedObject Subclass),您将看到父实体的类似内容。
@class Customer;
@interface MyDatabase : NSManagedObject {
}
@property (nonatomic, retain) NSSet *customers;
在您的 .m 文件中,
@implementation MyDatabase
@dynamic customers
- (void)addCustomersObject:(Customer *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"customers" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"customers"] addObject:value];
[self didChangeValueForKey:@"customers" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)removeCustomersObject:(Customer *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"givenSurveys" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"customers"] removeObject:value];
[self didChangeValueForKey:@"customers" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)addCustomers:(NSSet *)value {
[self willChangeValueForKey:@"customers" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
[[self primitiveValueForKey:@"customers"] unionSet:value];
[self didChangeValueForKey:@"customers" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}
- (void)removeCustomers:(NSSet *)value {
[self willChangeValueForKey:@"customers" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
[[self primitiveValueForKey:@"customers"] minusSet:value];
[self didChangeValueForKey:@"customers" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}
同样,这些是在创建文件时为您创建的,但如果由于某种原因它们不是,您可能没有正确设置关系。
要删除文件,您需要使用谓词获取上下文。返回的请求是一个NSArray,其中的对象符合条件(余额为 0)。在本例中,我们将只调用该数组objectsToRemove。在这一点上,我们已经准备好尝试两种可能的解决方案了。
1) 在此,您的核心数据没有子/父实体映射,只有一个实体。在这种情况下,您将使用如上所述的获取请求。然后你会调用类似下面的东西
for (id myObject in objectsToDelete) {
[self.managedObjectContext deleteObject:myObject];
}
// commit the changes;
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// handle the error;
}
这会删除所有对象,然后在完成后保存您的上下文。
2) 如果你有一个父/子核心数据映射,它会变得更容易。在这种情况下,您只需在获取请求期间调用以下命令
[myDatabase removeCustomers:[NSSet setWithArray:objectsToDelete]];
// commit the changes;
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// handle the error;
}
第二种方法一次删除所有对象,但确实要求您拥有一个包含Customer 对象的实体。在我看来,这是一种更好的方法,尽管不是必需的,特别是如果您不需要将 Customer 对象分成不同的组。这个Core Data tutorial 概述了经典的部门和员工项目,这是一个非常简单但清晰的示例,说明了如何在核心数据中使用父/子层次结构。