objective-c - NSFetchRequest 返回错误的实体类型

标签 objective-c ios macos core-data

我的 Core Data 应用有两个实体:“Note”和“Marker”。 Note 实体与标记具有一对多关系(即一个注释包含许多标记)。我有一个 fetchedRequestController 负责获取所有“Note”实体。创建 1 个音符和 1 个标记(属于该音符)后,我收到错误消息,因为 fetchedRequestController 获取了标记和音符。需要注释,但不应提取标记。

这是我获取的请求 Controller

    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 来自 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.0011s。

最佳答案

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

enter image description here

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

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

因此,如果您真的不需要Marker作为Note的子实体,只需将“Parent Entity”设置为“No Parent Entity”即可。 p>

关于objective-c - NSFetchRequest 返回错误的实体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149964/

相关文章:

ios - iOS 中 (BOOL) 和 boolValue 的区别

iphone - XCode 会在提交时拍摄我的应用程序的快照吗?

linux - 将 xls 文件转换为 xlsx 文件的 Unix 命令?

ruby - Mac 用户并收到警告 : Nokogiri was built against LibXML version 2. 7.8,但已动态加载 2.7.3

iphone - 如何从嵌套的 UIViewController 中获取正确的 UIInterfaceOrientation

python - 在 MacOSX 上为 Eclipse 多次安装 Python

ios - 相机如何跟踪两件事? cocos2d

ios - 在 'mylabel' 类型的对象上找不到属性 'uitableviewcell'

objective-c - 如何在 C 中使用隐写术在 PNG 中隐藏 4 个字母数字字符?

iphone - 使用自动布局和固定时更改 View 拉伸(stretch)