2012-03-27 3 views
2

UPDATE: У меня были записи призраков в моей базе данных игр без игроков, прежде чем я реализовал игроков вообще. Он возвращал эти записи не последним записям с обновленной модельюОсновные данные NSSet возвращает пустой массив объектов

Я работаю над тем, чтобы работать с базой данных Core Data и иметь проблемы с отношениями. Я очень новичок во всем этом, поэтому ничего не ставьте мимо меня, я даже не могу понять основы. Но здесь мы все равно идем.

Здесь я создаю новое игровое устройство. Игроки являются зависимыми отношениями с несколькими объектами Player, которые были выбраны и сохранены в массиве.

Game *newGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game" inManagedObjectContext:[SDDataManager dataManager].managedObjectContext]; 
    [newGame setGameType:@"multipleChoice"]; 
    [newGame setDate:[NSDate date]]; 
    NSSet *playersSet = [NSSet setWithArray:players]; 
    [newGame setPlayers:playersSet]; 
    [newGame setCards:[NSKeyedArchiver archivedDataWithRootObject:selectedCards]]; 

    NSError *error; 
    [[SDDataManager dataManager].managedObjectContext save:&error]; 
    NSLog(@"New Game Error: %@",[error localizedDescription]); 

Проблема заключается в том, что, когда я называю его из базы данных, как это:

NSFetchRequest * requestSavedGame = [NSFetchRequest fetchRequestWithEntityName: @ "Game"]; [requestSavedGame setFetchLimit: 1];

NSError *error; 
NSArray *loadedGame = [[SDDataManager dataManager].managedObjectContext executeFetchRequest:requestSavedGame error:&error]; 
NSLog(@"Load Game Error: %@",[error localizedDescription]); 

Game *game = [loadedGame objectAtIndex:0]; 
NSLog(@"Players Set: %@",game.players); 
NSLog(@"Players: %@",[game.players allObjects]); 

Игроки: пусто ??? Он возвращает это точно:

Players Set: Relationship 'players' fault on managed object (0xd023b70) <Game: 0xd023b70> (entity: Game; id: 0xd023180 <x-coredata://E6A82377-31D2-4D11-B890-B3FDC5A03E0E/Game/p1> ; data: { 
cards = <62706c69 73743030 d4010203 0405086e 6f542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572>; 
currentPlayer = 0; 
date = "2012-03-27 18:20:07 +0000"; 
gameType = multipleChoice; 
players = "<relationship fault: 0xd01fd60 'players'>"; 
}) 

Players: () 

Я не имею ни малейшего представления, почему игроки с полным массивом, то полный набор, когда он идет в России, но когда он выходит [Установить AllObjects] возвращает пустой массив ...

ответ

4

Я предлагаю вам использовать valueForKey для любого ключа.

В случае сбоя основных данных не возникает ошибка, это означает, что вы пытаетесь получить доступ к основным данным, которые не существуют. и я бы сказал, что вы должны использовать setPropertiesToFetch, который указывает, какие свойства должны быть возвращены приложением.

+0

Где именно вы говорите? Как на [game.players valueForKey: @ "name"]? или что-то типа того? –

+1

Я говорю, и у меня есть сомнения, есть ли в вашей игре игроки: P –

+0

Я думаю, что вы правы. Так что же не так с моим заявлением сохранения, тогда когда я устанавливаюPlayers ... NSSet, который я установил, не пуст. почему isnt Core Data сохраняет его или бросает ошибку? –

2

Сообщение о том, что это ошибка не означает, что он пуст. Это просто означает, что данные не были загружены из базы данных. Если вы обращаетесь к нему, как обычно, вы должны увидеть свои данные. Попробуйте это и посмотреть, что он говорит:

NSLog(@"Players count: %i", [game.players count]); 

Читайте о неисправностях здесь: Core Data Programming Guide - Faulting and Uniquing

+0

Он вернул null. Поэтому я думаю, что у меня нет игроков ... так что случилось с моим заявлением о хранении, которое игроки хранят? Я вызываю setPlayers и передаю NSSet из и Array ... –

+0

@lnafziger, о чем я говорил, это не ошибка. это просто игра не имеет игроков и пытается найти, чего не существует. –

+0

После того, как вы установили игроков, вы сохраняете контекст? – lnafziger

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