這是一個非常奇怪的情況,我在過去的幾天裏一直在努力解決。爲什麼我的核心數據對象不能在相同會話中創建的相關對象之間使用提取請求顯示?
我有一個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%運行。它也適用於在退出並重新啓動應用程序後向卡添加任何新的事務。
嘿邁克。謝謝你的提示。神奇記錄實際上是觸發2個上下文保存通知。我正在使用這些通知來觸發與Web服務的同步,結果是我無意中結束了每個創建的2個卡對象。然後提取請求獲取錯誤卡的數據並以零事務結束。 –