核心数据 NSSet 返回空的对象数组

Posted

技术标签:

【中文标题】核心数据 NSSet 返回空的对象数组【英文标题】:Core Data NSSet returning empty array of objects 【发布时间】:2012-03-27 19:09:14 【问题描述】:

更新:在我实现 Players 之前,我的游戏数据库中有没有玩家的幽灵条目。它返回那些条目而不是更新模型的最新条目

我正在努力让 Core Data 数据库正常工作,但在关系方面遇到了一些问题。我对整个事情都很陌生,所以不要把任何东西放在我身边,我什至可能不了解基础知识。但无论如何我们都走了。

这是我创建新游戏实体的地方。 Players 是与多个 Player 实体的 to-may 关系,这些实体被选择并存储在一个数组中。

    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: ( )

我不明白为什么玩家是一个完整的数组,然后当它进入时是一个完整的集合,但是当它出来时 [set allobjects] 返回一个空数组...

【问题讨论】:

【参考方案1】:

我建议您将 valueForKey 用于任何键。

在核心数据故障不是错误,这意味着您正在尝试从不存在的核心数据访问。我会说你应该使用 setPropertiesToFetch 来指定 fetch 应该返回哪些属性。

【讨论】:

你到底在说什么?喜欢 [game.players valueForKey:@"name"]?或类似的东西? 我在说,我怀疑你的游戏是否有玩家:P 我认为你是对的。那么当我 setPlayers 时,我的存储语句有什么问题......我设置的 NSSet 不是空的。为什么 Core Data 不保存它或抛出错误? 你得到了答案,因为你对我的游戏根本没有玩家的评论让我思考哈哈。非常感谢! 哈哈哈@RyanPoolos 一点问题都没有。【参考方案2】:

说这是一个错误的消息不是意味着它是空的。它只是意味着尚未从数据库中加载数据。如果您像往常一样访问它,您应该在那里看到您的数据。试试这个,看看它说了什么:

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

在此处阅读有关故障的信息:Core Data Programming Guide - Faulting and Uniquing

【讨论】:

它返回空值。所以我想我没有球员......所以我的存储声明有什么问题,即球员正在被存储?我调用 setPlayers 并传入一个 NSSet 和 Array... @lnafziger 这就是我所说的,这不是错误。它只是游戏没有任何玩家并试图获取不存在的玩家。 设置播放器后,是否保存上下文? 是的,我愿意。至少我想我会大声笑。我在 managedObjectContext 上调用 save:&error。您可以在那里查看第一段代码。它是倒数第二行。 再次检查playersSet 是否包含您期望的对象。即在[newGame setPlayers:playersSet]; 之前尝试NSLog(@"%i", [playersSet count]);

以上是关于核心数据 NSSet 返回空的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

将核心数据对象设置为 NSSet

从对象处理空的Json数组

核心数据麻烦排序相关对象的 NSSet

用 CoreData 对象填充 NSSet

核心数据 - 使用数组的确切元素获取对象过滤数据

如何将获取的对象保存到核心数据