我遇到了将ADN中的帖子映射到我的数据库的问题。
请记住我正在使用MagicalRecord自动将JSON映射到我设置的NSManagedObjects。
可以在这里看到JSON:http://web.archive.org/web/20170123035402/https://developers.app.net/reference/resources/post/,特别是带有实体的部分。
我的核心数据模型已设置为以下关系:
Post <-> Entities <->> Links/Hashtags/Mentions
关系已经设置了正确的名称,因此MagicalRecord应该能够很好地映射树。 Post对象有一堆属性。它与Entities对象的关系称为“实体”,这是因为主键(AFAIK来自它在MagicalRecord中的代码中断的地方)而失败的地方。
由于Entities基本上只是一个保存每个实体类型关系的对象,因此我没有Entity对象的任何属性。不幸的是,它似乎没有帮助为Entity对象设置一个随机名称的属性。
根据以上信息,您是否可以采取不同的方式正确映射关系和对象?是否可以将这个空的Entities对象用于与每个实体类型的关系,以及如何使用“entities”字典设置ADN帖子。
答案 0 :(得分:0)
首先,你忽略了描述你的“问题”,只描述你的情景。究竟什么不符合您的期望?
核心数据实体上属性的存在与否将不会影响其行为。
然而,“实体”这个名字让我的蜘蛛感觉刺痛。虽然NSManagedObject没有(公共)“实体”属性或方法,但它确实有一个“实体”方法。
更新:我使用以下模型手动创建了一个新的Core Data测试项目:
项目&lt; - &gt;实体&lt; - &gt;&gt;富
和这段代码:
NSManagedObjectContext *moc = [self managedObjectContext];
NSManagedObject *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
inManagedObjectContext:moc];
NSManagedObject *ent = [NSEntityDescription insertNewObjectForEntityForName:@"Entities"
inManagedObjectContext:moc];
NSManagedObject *foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:moc];
[item setValue:ent forKey:@"entities"];
[foo setValue:ent forKey:@"entities"];
NSLog(@"%@ -> %@ -> %@", item, ent, foo);
它工作正常。
更新:我能找到最接近造成奇怪行为的事情是:
[item setValue:@(YES) forKey:@"deleted"];
[item setValue:@(YES) forKey:@"is_deleted"];
NSLog(@"deleted=%@", [[item valueForKey:@"deleted"] boolValue] ? @"YES" : @"NO");
NSLog(@"is_deleted=%@", [[item valueForKey:@"is_deleted"] boolValue] ? @"YES" : @"NO");
日志将打印“deleted = NO”和“is_deleted = YES”,这在前一种情况下是错误的。预先存在的“isDeleted”方法会阻止自动生成“已删除”属性的“已删除”访问者。
答案 1 :(得分:0)
所以问题确实与MagicalRecord以及我自己设置NSManagedObjects和关系的方式有关。
MagicalRecord使用主键来处理关系。如果尚未设置,则使用其中一个属性。在我的例子中,Entities
NSManagedObject没有任何属性,因为我只是用它来处理每个实体类型的关系。
可以在NSObject+MagicalDataImport.m
:
- (NSString *) MR_lookupKeyForRelationship:(NSRelationshipDescription *)relationshipInfo
{
NSEntityDescription *destinationEntity = [relationshipInfo destinationEntity];
if (destinationEntity == nil)
{
MRLog(@"Unable to find entity for type '%@'", [self valueForKey:kMagicalRecordImportRelationshipTypeKey]);
return nil;
}
NSString *primaryKeyName = [relationshipInfo MR_primaryKey];
NSAttributeDescription *primaryKeyAttribute = [[destinationEntity attributesByName] valueForKey:primaryKeyName];
NSString *lookupKey = [[primaryKeyAttribute userInfo] valueForKey:kMagicalRecordImportAttributeKeyMapKey] ?: [primaryKeyAttribute name];
return lookupKey;
}
特别是[[destinationEntity attributesByName] valueForKey:primaryKeyName];
返回nil。
起初我使用了一个名为“test”的属性进行了测试,但我不确定我做了什么不起作用,也许还没有做好清理缓存的工作。我再次尝试清除关系,所以我没有那些担心,然后我在实体NSManagedObject
上添加了一个属性“实体”,这一切都很有效!
对不起。只需添加答案和注释,以防任何人遇到这个问题,他们使用MagicalRecord并且NSManagedObject没有任何属性。