使用魔法记录在核心数据中映射和发布实体

时间:2012-12-15 13:25:26

标签: ios json core-data magicalrecord

我遇到了将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帖子。

2 个答案:

答案 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没有任何属性。