2014-04-10 61 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