0

我在将 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 对象有一堆属性。它与实体对象的关系称为“实体”,这似乎是由于主键而失败的地方(AFAIK 从它在 MagicalRecord 中的代码中中断)。

由于实体基本上只是一个保存与每个实体类型的关系的对象,因此我没有实体对象的任何属性。不幸的是,它似乎无助于为 Entity 对象设置具有随机名称的属性。

根据上述信息,您是否会采取不同的措施来正确映射关系和对象?是否可以使用我仅用于与每个实体类型的关系的这个空实体对象,有点像如何使用“实体”字典设置 ADN 帖子。

4

2 回答 2

0

首先,您忽略了描述您的“问题”,只描述了您的场景。究竟是什么行为不符合您的预期?

核心数据实体上是否存在属性不会影响其行为。

然而,“实体”这个名字让我感觉有点刺痛。虽然 NSManagedObject 没有(公共)“实体”属性或方法,但它确实有一个“实体”方法。

更新:我使用以下模型手动创建了一个新的核心数据测试项目:

项目 <-> 实体 <->> Foo

这个代码:

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”方法防止为“deleted”属性自动生成“deleted”访问器。

于 2012-12-15T15:32:14.260 回答
0

因此,对于我设置 NSManagedObjects 和关系的方式,MagicalRecord 和我自己确实存在一些问题。

MagicalRecord 使用主键来处理关系。如果尚未设置,则使用其中一个属性。在我的例子中,EntitiesNSManagedObject 没有任何属性,因为我只是使用它来处理与每个实体类型的关系。

可以在以下位置找到此代码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];返回零。

起初我用一个名为“test”的属性进行了测试,但我不确定我做了什么没有奏效,也许是在清除缓存方面做得不够好。我再次尝试清除关系,所以我不用担心这些关系,然后我在实体上添加了一个属性“实体”,NSManagedObject一切都很好!

对不起。只需添加答案和评论,以防有人在使用 MagicalRecord 并且 NSManagedObject 没有任何属性时遇到此问题。

于 2012-12-15T17:07:33.583 回答