【问题标题】:NSFetchRequest returns wrong entity typeNSFetchRequest 返回错误的实体类型
【发布时间】:2012-12-18 11:13:44
【问题描述】:

我的 Core Data 应用有两个实体:“Note”和“Marker”。 Note 实体与标记具有一对多的关系(即,注释包含许多标记)。我有一个 fetchedRequestController 负责获取所有“Note”实体。创建 1 个注释和 1 个标记(属于该注释)后,我收到一个错误,因为 fetchedRequestController 获取了标记和注释。 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 时间码[10269:c07] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA

2013-01-03 17:41:12.063 时间码[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 FROM 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 秒。

【问题讨论】:

  • 更新和批准的答案。以前不知道;)
  • 刚刚注意到我的 SQLite 架构没有标记实体的表。不知道为什么会这样。有一个 ZNOTE 表,但没有 ZMARKER 表。

标签: objective-c ios macos core-data


【解决方案1】:

您已将Note定义为Marker的“父实体”,即MarkerNote:

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

在这种情况下,SQLite 文件只包含一个表 ZNOTE,其中包含 Note 的属性和 Marker 的附加属性的列。

所以如果你真的不需要 Marker 成为 Note 的子实体,只需将“父实体”设置为“无父实体”即可。

【讨论】:

  • 我完全误解了“父”属性!认为这意味着父节点。 Muchos gracis :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多