My Core Data应用程序有两个实体:“Note”和“Marker”。 Note实体与标记具有1对多的关系(即。注释包含许多标记)。我有一个fetchedRequestController,它负责获取所有“Note”实体。在创建1个音符和1个标记(属于该音符)后,我收到错误,因为fetchedRequestController同时获取Marker和Note。预期Note,但不应提取标记。
这是我提取的请求控制器
TCModel *model = [TCModel sharedModel];
NSManagedObjectContext *context = [model managedObjectContext];
NSParameterAssert(context);
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:context];
NSParameterAssert(entity);
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"Root"];
NSParameterAssert(controller);
self.fetchedResultsController = controller;
controller.delegate = self;
NSError *error;
BOOL success = [controller performFetch:&error];
if ( success == NO )
{
NSLog(@"Failed to fetch!");
NSParameterAssert(nil);
}
使用两个辅助方法创建对象,然后使用第三个
保存- (TCNote *)newNote
{
TCNote *note = [NSEntityDescription insertNewObjectForEntityForName:@"Note"
inManagedObjectContext:self.managedObjectContext];
note.creationDate = [NSDate new];
return note;
}
- (TCMarker *)newMarker
{
TCMarker *marker = [NSEntityDescription insertNewObjectForEntityForName:@"Marker"
inManagedObjectContext:self.managedObjectContext];
return marker;
}
- (void)_save
{
NSError *error;
NSLog(@"Saving");
if (![self.managedObjectContext save:&error])
{
NSLog(@"Error saving context: Error = %@", error);
}
}
这是控制台输出:
2013-01-03 17:41:12.062 timecode [10269:c07] CoreData:sql:SELECT Z_VERSION,Z_UUID,Z_PLIST FROM Z_METADATA
2013-01-03 17:41:12.063 timecode [10269:c07] CoreData:sql:SELECT t0.Z_ENT,t0.Z_PK,t0.Z_OPT,t0.ZNOTEDATE,t0.ZSCENEDESCRIPTION,t0.ZSCENETITLE,t0。 ZTIMECODEDATE,t0.ZDATE,t0.ZTITLE,t0.ZPARENT,t0.Z1_PARENT来自ZNOTE t0
2013-01-03 17:41:12.064 timecode [10269:c07] CoreData:annotation:sql connection fetch time:0.0005s
2013-01-03 17:41:12.064 timecode [10269:c07] CoreData:注释:总获取执行时间:2行0.0011秒。
答案 0 :(得分:1)
您已将 Note 定义为 Marker 的“父实体”,即 Marker 是 Note <的“子实体” / EM>:
这意味着每个 Marker 对象也是 Note 对象(与类和子类相同)。因此,获取 Note 实体的所有对象也会返回 Marker 实体的对象。
在这种情况下,SQLite文件只包含一个表ZNOTE,它包含 Note 属性的列以及 Marker 的其他属性。
因此,如果您不需要 Marker 成为 Note 的子实体,只需将“Parent Entity”设置为“No Parent Entity”。