【问题标题】:Core Data getting [_NSObjectID_48_1 userName]: unrecognized selector sent to instance核心数据获取 [_NSObjectID_48_1 userName]:发送到实例的无法识别的选择器
【发布时间】:2015-03-12 13:10:16
【问题描述】:

A->>B

我有两个实体 A&B,每个实体都以一对多的关系相关。我正在尝试通过分组访问特定的 B 属性值和所有 A 实体属性。但是,当我尝试访问 B(即 a)的关系对象时,我收到错误 [_NSObjectID_48_1 userName]: unrecognized selector sent to instance。

NSManagedObjectContext *context = [[SamCoreDataHelper sharedInstance] managedObjectContext];

    NSFetchRequest *fr = [[NSFetchRequest alloc] initWithEntityName:@"B"];
    NSError *error;
    NSExpressionDescription *total = [[NSExpressionDescription alloc] init];
    [total setExpression:[NSExpression expressionWithFormat:@"@sum.marks"]];
    [total setName:@"total"];
    [total setExpressionResultType:NSDecimalAttributeType];


    [fr setPropertiesToFetch:[NSArray arrayWithObjects:@"subject",@"a", total, nil]];
    [fr setPropertiesToGroupBy:[NSArray arrayWithObjects:@"subject", @"a", nil]];
    [fr setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"a"]];
    fr.returnsObjectsAsFaults = NO;
    [fr setResultType:NSDictionaryResultType ];

    NSArray *resultArray = [context executeFetchRequest:fr error:&error];

for (NSDictionary *result in resultArray) {
        NSNumber *total = [result valueForKey:@"total"];
        NSString *subject = [result valueForKey:@"subject"];
        A *a = [result objectForKey:@"a"];
        NSLog(@"%@", a.useName);// Here I am getting error as **[_NSObjectID_48_1 userName]: unrecognized selector sent to instance**
}

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    NSFetchRequest 的结果设置为NSDictionaryResultType 时,您将收到“对象ID”而不是NSManagedObject 的实例。

    所以你需要“按对象 id”获取它:

    A * a = (A*)[ managedObjectContext objectWithID:[result valueForKey:@"a"]];
    NSLog("%@",a.userName );
    

    UPD:

    fr.returnsObjectsAsFaults = NO;
    

    这里没用,因为返回类型是NSDictionaryResultType

    【讨论】:

    • 它适用于 Sim。非常感谢。过去 2 小时我一直在崩溃。
    • @Nandha 不客气,我更喜欢在一个简单的道具上进行“分组”,这样结果就可以在没有额外工作的情况下使用。在您的情况下,我会在 setPropertiesToFetch 中使用“a.userName”而不是“a”。如果我需要来自“a”的更多数据,我会以类似的形式将其放在那里。
    【解决方案2】:

    如何使用以下迭代..

    for (A *a in resultArray) {
            NSLog(@"%@", a.useName); 
    }
    

    【讨论】:

    • 这里的结果类型是NSDictionaryResultType,所以我们可以直接访问A对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多