2014-07-15 19 views
0

我有一个名为Interaction的类,或多或少地管理NSManagedObject,并保持整个应用程序的状态。当试图通过核心数据循环访问不良有很多

// In IntroViewController 
AppDelegate *applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

applicationDelegate.interaction = [[Interaction alloc] init]; 
[applicationDelegate.interaction createNewInteractionByCallId:[NSNumber numberWithInt:1] programId:[NSNumber numberWithInt:2] questionnaireId:[NSNumber numberWithInt:3] outletId:[NSNumber numberWithInt:4] userId:[NSNumber numberWithInt:5]]; 

于是就有我设置了互动的一个实例,并使用create方法我已经在那里建立了管理对象:

- (void)createNewInteractionByCallId:(NSNumber *)callId programId:(NSNumber *)programId questionnaireId:(NSNumber *)questionnaireId outletId:(NSNumber *)outletId userId:(NSNumber *)userId 
{  
    NSManagedObjectContext *context = [self getManagedContext]; 

    NSManagedObject *interaction = [NSEntityDescription insertNewObjectForEntityForName:@"Interaction" inManagedObjectContext:context]; 

    [interaction setValue:[NSDate date] forKey:@"date_started"]; 
    [interaction setValue:[self createGUUID] forKey:@"uuid"]; 
    [interaction setValue:callId forKey:@"call_id"]; 
    [interaction setValue:programId forKey:@"program_id"]; 
    [interaction setValue:questionnaireId forKey:@"questionnaire_id"]; 
    [interaction setValue:userId forKey:@"user_id"]; 
    [interaction setValue:outletId forKey:@"outlet_id"]; 
    [self saveRecord]; 
    self.managedObject = interaction; 
} 

为了描述的实体。交互有很多答案。答案与我们的远程服务器上的问题ID相关。

所以当我添加一个答案时,我会检查给定questionId的答案并更新它,或者创建一个新答案。这就是事情都吹了起来:从Interaction.m

- (NSMutableSet *)getAnswers 
{ 
    [self.managedObject mutableSetValueForKey:@"answers"]; 
} 

但是我得到的坏访问错误的for循环线

- (void)addAnswerFor:(NSNumber *)questionId questionType:(NSNumber *)questionType formId:(NSNumber *)formId answerText:(NSString *)answerText 
{ 
    NSManagedObject *answer; 

    NSMutableSet *answers = [self getAnswers]; 
    NSArray *answersArray = [answers allObjects]; 
    for (NSManagedObject *ans in answersArray) { 
     if ([ans valueForKey:@"question_id"] == questionId) { 
      answer = ans; 
     } 
    } 
    // ... 
} 

//找到答案:

EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 

我是否需要初始化关系的空集?

回答

2

检查getAnswers是否按预期工作。我怀疑这是nil,那会给你这样的错误。 (但是,您应该编辑您的问题并发布确切的错误消息。)

在快速枚举(没有排序)之前,无需转换为answersArray

顺便说一句,如果多个答案匹配一个问题,你将覆盖最后的结果。但我想这是一个不可预见的情况。

另外,也许你可以完全使用谓词摆脱循环:

NSSet *matchingAnswers = [answers filteredSetUsingPredicate: 
    [NSPredicate predicateWithFormat:@"question_id == %@", questionId]]; 
NSManagedObject *answer = 
    matchingAnswers.count ? matchingAnswers.anyObject : nil; 

最后,我认为你的整个设置与交互类是一个坏主意。由于所有这些繁琐的方法都会传递大量的参数,因此您根本没有真正封装逻辑,而是实际上在各处传播定制的复杂性。最好将简单的Core Data方法写入控制器,完全免除Interaction类。

+0

我很欣赏这个输入。请注意,NSSet似乎没有firstObject propery :)。结束使用anyObject,但正如你所说,如果交互对给定的question_id有多个问题,可能会导致意外的行为。我用错误代码更新了我的问题,并将其放入getAnswers方法中。关于为什么可能返回零的任何想法?我同意交互类本身需要一些改进,但是如果我将逻辑保存到视图控制器中,是不是会导致整个应用程序有很多重复代码? – agmcleod

+0

我刚刚意识到了核心问题。我没有在getAnswers中调用return语句... do'h。我把它留在问题中作为参考。 – agmcleod

+0

感谢您的提示。我将其更正为“anyObject”。 – Mundi