NSFetchRequest返回错误的实体类型

时间:2013-01-04 01:44:04

标签: objective-c ios macos core-data

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秒。

1 个答案:

答案 0 :(得分:1)

您已将 Note 定义为 Marker 的“父实体”,即 Marker Note <的“子实体” / EM>:

enter image description here

这意味着每个 Marker 对象也是 Note 对象(与类和子类相同)。因此,获取 Note 实体的所有对象也会返回 Marker 实体的对象。

在这种情况下,SQLite文件只包含一个表ZNOTE,它包含 Note 属性的列以及 Marker 的其他属性。

因此,如果您不需要 Marker 成为 Note 的子实体,只需将“Parent Entity”设置为“No Parent Entity”。