我的 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 的“父实体”,即Marker 是Note< 的“子实体”/em>:
这意味着每个 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/