NSManagedObject插入和编辑

时间:2014-04-10 12:06:43

标签: ios objective-c core-data

我正在尝试实现一个函数来编辑某个条目,或者如果不存在则创建新条目。 这是代码

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之后也得到了一个对象,但是如果我试图将对象[0]分配给newConnection,我会收到错误EXC_BAD_ACCESS。 有一个更好的方法吗?我做错了什么?

解决方案:

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

2 个答案:

答案 0 :(得分:0)

检查您尝试访问的阵列中是否有任何对象始终是一个好习惯。

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

最有可能的情况是,您的获取请求不会返回任何对象。而且你仍然试图访问索引0处的对象。因此崩溃

答案 1 :(得分:0)

NSManagedObject应该使用Entity:

启动
  

从根本上创建一个托管对象NSManagedObject是一个   Objective-C类与任何其他Objective-C类一样。像其他各种各样   类,NSManagedObject对实例施加了一些约束   创建。如前所述,您必须关联新的托管   具有定义其属性的实体对象的对象实例   使用定义其环境的托管对象上下文。您   因此,只能通过发送init来初始化托管对象   消息,你必须使用指定的   initializer-initWithEntity:insertIntoManagedObjectContext:-which sets   实体和上下文

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];
        }