这是一个非常奇怪的情况,我在过去几天一直在努力解决。
我有一个Card
实体与实体上的多对多关系Transaction
。我还使用 Magical Record 来删除围绕管理我的数据存储的样板代码。
我的问题按以下顺序发生:
- 创建一个
Card
对象 Transaction
然后在另一个视图中创建一个对象- 当我检查交易计数时,
[card.transactions count]
我得到 1 作为大小 但是,如果我使用相同的上下文执行获取请求,则事务不存在。我的谓词如下所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"card == %@ && deleted == 0", card];
所以逻辑说我可能在保存事务后没有保存上下文,但奇怪的是,如果我退出应用程序然后重新运行它,事务就在那里。如果我创建卡、退出应用程序然后运行应用程序并添加交易,那么步骤 1-4 也可以完美运行。然后我的保存交易代码工作正常。
所以我的问题是,为什么我的对象没有在新创建的父对象上使用获取请求显示,其中“新创建”意味着它是在与子对象相同的会话中创建的。
我创建卡片的代码如下所示:
GYCard *card = [GYCard MR_createInContext:[NSManagedObjectContext MR_defaultContext]];
[[NSManagedObjectContext MR_defaultContext] MR_save];
然后当我保存交易时,我的代码如下所示:
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext];
NSNumber *transactionAmount = [self.numberFormatter numberFromString:self.transactionAmountLabel.text];
GYTransaction *transaction = [GYTransaction MR_createInContext:localContext];
transaction.amount = transactionAmount;
transaction.deleted = [NSNumber numberWithBool:NO];
transaction.card = self.card;
[localContext MR_save];
不工作的代码是这样的:
+ (int) countTransactions:(GYCard *) card {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"card == %@ && deleted == 0", card];
return [GYTransaction MR_countOfEntitiesWithPredicate:predicate inContext:[NSManagedObjectContext MR_defaultContext]];
}
如果卡片是在同一会话中创建的,则 countTransactions 始终返回 0。但如果我退出应用程序并重新启动,它会 100% 工作。它还适用于在退出并重新启动应用程序后向卡添加任何新交易。