CoreData以1对多的方式检索值

时间:2013-11-07 20:21:23

标签: ios core-data

我整天都在苦苦挣扎。我有一个CD模型,它有一个实体sales_rep,它与另一个名为customers的实体有1对多的关系。

我可以检索并显示存储在这里的sales_rep数据:

SALES_REP_DATA* thisSalesRepData

我可以得到客户数量的计数:

thisSalesRepData.hasCustomers.count

这将返回正确数量的记录(在本例中为37)

但我无法获取客户信息。我没有设置CD,所以实体是CUSTOMER但是类是CUSTOMER_DATA。

如果我这样做:

NSArray* arrCustomers = [thisSalesRepData.hasCustomers allObjects];

for(CUSTOMER_DATA* thisCustomer in arrCustomers) {
      DDLogVerbose(@"%@", thisCustomer.customer_name);      
}

我得到了空白

如果我记录这个客户,我会得到:

Thursday, 07 November 2013 | 15:14:37 | AppViewController | getClientList: | 312 | <CUSTOMER_DATA: 0x8c85260> (entity: CUSTOMER; id: 0x8c849a0 <x-coredata://AC4450A8-3D03-4E9A-8EFD-47055FA0683A/CUSTOMER/p173> ; data: <fault>)

如何获取客户信息?

编辑:以下是我设置客户的方式 - 我已经验证了dictThisCustomerRevised具有值。:

//loop

//get the entity description for this class
                NSEntityDescription* customerEntityDescription = [NSEntityDescription entityForName:@"CUSTOMER" inManagedObjectContext:_moc];

                //init class
                CUSTOMER_DATA* thisCustomer = [[CUSTOMER_DATA alloc]initWithEntity:customerEntityDescription insertIntoManagedObjectContext:_moc];

                //populate it
                thisCustomer.cf1_level_1_cd = [dictThisCustomerRevised objectForKey:@"cf1_level_1_cd"];
                thisCustomer.customer_address = [dictThisCustomerRevised objectForKey:@"customer_address"];
                thisCustomer.customer_city = [dictThisCustomer objectForKey:@"customer_city"];
                thisCustomer.customer_zip_base = [dictThisCustomer objectForKey:@"customer_zip_base"];
                thisCustomer.customer_num = [dictThisCustomer objectForKey:@"customer_num"];
                thisCustomer.customer_name = [dictThisCustomer objectForKey:@"customer_name"];
                thisCustomer.customer_class_cd = [dictThisCustomer objectForKey:@"customer_class_cd"];
                thisCustomer.state_cd = [dictThisCustomer objectForKey:@"state_cd"];
                [arrSalesRepCustomers addObject:thisCustomer];

                NSSet* setSalesRepCustomers = [[NSSet alloc] initWithArray:arrSalesRepCustomers];

                [thisSalesRepData addHasCustomers:setSalesRepCustomers];

//save this
            NSError* error;
            [_moc save:&error];

2 个答案:

答案 0 :(得分:0)

可能未设置customer_name(因为日志显示您有实际的客户实例)。

答案 1 :(得分:0)

您的代码是正确的。您的thisCustomer日志声明表明它已正确检索。实际上,尽管您写的是“我得到NULL”,但您实际上可以按预期获得客户数据。

不要对日志语句中的fault这个词感到困惑。它只是意味着如果需要,可以在幕后检索更多细节。没什么好担心的。

可能对您有所帮助的一点是清理您的实体名称。您的代码将以这种方式变得更具可读性:

  • 遵循Objective C约定使用大写(不是ALL_CAPS)类名。
  • 使用具体的英语名词,例如“SalesRep”,“Customer”。
  • 也可以将它们用于关系名称,因此“客户”代替“hasCustomers”(这可能是布尔属性的合适getter,但在这里明显不合适)。
  • 避免冗余。 Customer实体的“city”属性不必是“customer_city”。一个简单的“城市”就足够了。

像这样,您的代码应该变得更易于理解,并且不易出错。

为了获取您的客户信息,只需记录thisCustomer.city之类的内容,您就会发现它可以毫无问题地被检索出来。