我对核心数据很陌生。我的理解是它是一个对象图管理器,与数据库不同。其中,一些功能将由程序员实现。
在编写一些在 coredata 框架中具有更好和更优化对应物的逻辑之前:是否可以添加唯一键?像entityA.name=@"jem"
, entityB.name=@"jem"
, 由于名称已在使用中而无法插入 entityB?
谢谢 :-) 杰姆。
我对核心数据很陌生。我的理解是它是一个对象图管理器,与数据库不同。其中,一些功能将由程序员实现。
在编写一些在 coredata 框架中具有更好和更优化对应物的逻辑之前:是否可以添加唯一键?像entityA.name=@"jem"
, entityB.name=@"jem"
, 由于名称已在使用中而无法插入 entityB?
谢谢 :-) 杰姆。
Core Data 在很大程度上是一个数据库,用于设置实体和属性的 GUI 只是其中的一部分。我不相信已经有拒绝非唯一键的功能,但是您可以在插入新实体之前执行以下操作来运行检查:
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
BOOL unique = YES;
NSError *error;
NSArray *items = [managedObjectContext executeFetchRequest:request error:&error];
if(items.count > 0){
for(Person *thisPerson in items){
if([thisItem.name isEqualToString: nameToEnter]){
unique = NO;
}
}
}
if(unique){
CartItem *thisItem = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
thisItem.name = nameToEnter;
NSError *error;
if (![self.managedObjectContext save:&error]) {
return;
}
}
你应该很好
与上述类似,但在对象代码中作为一种验证方法。因此,我们将其与主代码隔离开来:
-(BOOL)validateForInsert:(NSError **)error {
if (![super validateForInsert:error]) {
NSLog(@"Validate for insert FALSE: %@", *error);
return NO;
}
return [self validateConsistency:error];
}
-(BOOL)validateForUpdate:(NSError **)error {
if (![super validateForUpdate:error]) {
NSLog(@"Validate for update FALSE: %@", *error);
return NO;
}
return [self validateConsistency:error];
}
-(BOOL)validateConsistency:(NSError **)error {
// Count number of names
NSArray *accounts = [Account whereFormat:@"name == '%@'", self.name];
if ([accounts count] > 1) {
// Error!
注意:我使用了 ObjectiveRecord,但我相信你知道如何计算你的记录。