2010-01-14 3 views
0

Я создал два объекта в моей модели, учетной записи и другом - где 1 У учетной записи будет много друзей. Я также создал эти два объекта в коде.Правильный способ добавления реляционных данных к данным ядра

Я использую UITableView для отображения своих учетных записей (все отлично) и с помощью нового UIViewController для добавления новой записи. В новой записи я добавляю данные учетной записи и получаю друзей от API. Переходя от UITableView к новому UIViewController, я создаю пустой объект Account: UIViewController.account = account;

Теперь сложная часть. При сохранении этих данных я делаю следующее:

// Configure the new account with information from the form. 
[account setUsername:[profileDict objectForKey:@"the_name"]]; 
[account setPassword:password.text]; // from formfield 
[account setCreationDate:[NSDate date]]; 

// Commit the change. 
NSError *error; 
if (![account.managedObjectContext save:&error]) { 
    // Handle the error. 
    NSLog(@"save error"); 
} 

NSManagedObjectContext *context = [account managedObjectContext]; 

for(NSArray *names in usernameArray) //usernameArray holds my Friends 
{ 

    friend = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" inManagedObjectContext:context]; 
    [account addReplyAccountsObject:friend]; 
    [friend setName:[names objectAtIndex:0]]; 
    [friend setPicUrl:[names objectAtIndex:1]]; 

    // Commit the change. 
    NSError *error; 
    if (![context save:&error]) { 
     // Handle the error. 
     NSLog(@"save error"); 
    }  
} 

Теперь это похоже на работу - однако иногда мое приложение вылетает с ошибкой шины - обычно на устройстве, а не на тренажере. Это правильный способ сохранить учетную запись и много друзей сразу? Также - по какой-то причине, я бы получил ошибку шины? Это, кажется, происходит, когда есть много друзей ....

ответ

1

Я думаю, что есть ошибка в строке:

friend = [NSEntityDescription insertNewOb... 

Вы должны объявить тип переменной:

Friend *friend = [NSEntityDescription insertNewObj... 

(Предполагая, что ваш класс Друга назван Friend.)

Кроме того, я бы не совершал изменения каждый раз вокруг цикла. Внесите изменения, а затем, когда вы закончите, сделайте их:

for(NSArray *names in usernameArray) //usernameArray holds my Friends 
{ 
    // ... 
} 

// Commit the change. 
NSError *error; 
if (![context save:&error]) { 
    // Handle the error. 
    NSLog(@"save error"); 
}  
+0

Друг объявляется в моем файле .h в качестве друга * друга. – mootymoots

+1

Если вы вставляете новые объекты-знакомые в такой цикл, то это очень плохая идея объявить его в заголовке. Вы должны использовать локальную переменную, так как иначе 'friend' будет ссылаться только на последний введенный объект. Не говоря уже о том, что вы ссылаетесь на временные данные без необходимости. –

+0

@mootymoots: Просто из интереса, сделал ли код фиксации из цикла исправить ошибку? Кроме того, как комментирует @Marcus S. Zarra, установка одной и той же переменной экземпляра снова и снова является плохой идеей - вместо этого используйте локальную переменную. –

Смежные вопросы