2014-04-10 36 views
0

我试图实现一个函数来编辑一些条目,或者如果什么都不存在,则创建一个新条目。 下面是代码NSManagedObject插入和编辑

NSManagedObject *newConnection = [[NSManagedObject alloc] init]; 
if(_connection != nil) { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Connection" inManagedObjectContext:context]; 

    [request setEntity:entityDesc]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF == %@", _connection.connectionID]; 
    [request setPredicate:pred]; 
    NSError *error; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 
    if([objects count] > 0) { 
     newConnection = objects[0]; 
    } 
} 
else { 
    newConnection = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:context]; 
} 

_connection是对象,我从以前的观点越来越如果我想编辑的连接。我在executeFetchRequest之后也得到1个对象,但是如果我试图将对象[0]分配给newConnection,我得到一个错误EXC_BAD_ACCESS。 有没有更好的方法来做到这一点?我究竟做错了什么?

溶液:

NSManagedObject *newConnection;代替NSManagedObject *newConnection = [[NSManagedObject alloc] init];

+0

如果应该编辑连接,我从前一个视图中获取对象。 _connection是零当我试图添加新的连接 – D051P0

+0

如果您创建,newConnection类型ID,并且不会瞬时执行第一行中的任何操作,它仍会崩溃吗? – DogCoffee

+0

@Smick是的,它现在可行! – D051P0

回答

0

的NSManagedObject应与实体发起:

创建一个管理对象从根本上说NSManagedObject是 Objective-C类像任何其他Objective-C类。像其他各种类一样,NSManagedObject对创建实例 施加了一些限制。如前所述,您必须将新的托管对象实例与定义其属性的实体对象关联,并将其与定义其环境的托管对象上下文关联起来。您 不能因此通过发送一个init 消息只是初始化一个管理对象,必须使用指定的 初始化-initWithEntity:insertIntoManagedObjectContext:哪位设置 实体和上下文都

newConnection不能有任何的实体在它正在初始化的那一刻。所以正确的方法是只获得一个指针。然后进行初始化。我希望,我的描述是正确的。

NSManagedObject *newConnection; 
     if(_connection != nil) { 
      NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
      NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Connection" inManagedObjectContext:context]; 

      [request setEntity:entityDesc]; 
      NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF == %@", _connection.connectionID]; 
      [request setPredicate:pred]; 
      NSError *error; 
      NSArray *objects = [context executeFetchRequest:request error:&error]; 
      if([objects count] > 0) { 
       newConnection = objects[0]; 
      } 
     } 
     else { 
      newConnection = [NSEntityDescription insertNewObjectForEntityForName:@"Connection" inManagedObjectContext:context]; 
     } 
0

它始终是一个很好的做法,以检查是否有您试图访问数组中的任何对象。

NSArray *objects = [context executeFetchRequest:request error:&error]; 
if([objects count]>0) { 
    newConnection = objects[0]; 
} 

很可能在您的情况下,您的提取请求没有返回任何对象。而且还是你想在索引0。因此崩溃访问对象

+0

我得到的对象,但仍然得到一个EXC_BAD_ACCESS错误 – D051P0

+0

你到底在哪里得到错误?即使在其他情况下,在访问newConnection = objects [0];上的内容 –

+0

之前检查该数组也是一种很好的做法。 – D051P0