2012-05-10 51 views
1

這是一個非常奇怪的情況,我在過去的幾天裏一直在努力解決。爲什麼我的核心數據對象不能在相同會話中創建的相關對象之間使用提取請求顯示?

我有一個Card實體在Transaction實體上具有多對多關係。我還使用Magical Record去除管理我的數據存儲的樣板代碼。發生在下列順序

我的問題:

  1. 創建Card對象
  2. 然後在另一個視圖
  3. 創建Transaction對象。當我檢查與[card.transactions count]交易算我送1的大小
  4. 但是,如果我使用相同的上下文執行提取請求,則交易不在那裏。我的謂詞如下所示:

    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

這似乎是一個神奇的記錄問題。我正在使用魔法記錄的2.0 beta分支,並在恢復爲標記版本後:1.8.3問題消失。所以2.0似乎是罪魁禍首。然而,知道2.0版爲何導致這個問題仍然很有趣。

我強烈建議任何人使用魔法記錄來避免2.0分支,直到它出來測試版。

更新:經過進一步調查,究竟是什麼2。魔法記錄的0測試版正在爲1次保存生成2個保存通知,這導致我的應用程序無意中有2個版本的卡。這導致我登錄的交易記錄在第一張卡上,但第二張卡顯然沒有交易。我的提取請求然後獲取第二張卡並返回零交易。退出並重新啓動應用程序,然後讓我的應用程序從數據存儲中加載正確的事務,從而按預期工作。

0

這可能與NSFetchRequest上的includesPendingChanges財產有關。但是,默認值爲YES,這意味着任何查詢中都應包含任何未保存的更改。

我不知道什麼MR_方法是引擎蓋下做的,但setIncludesPendingChanges: documentation狀態:

特別注意事項

YES的值與結果相結合,不支持鍵入 NSDictionaryResultType,包括計算聚合結果 (如max和min)。對於字典,從 獲取返回的數組反映了持久存儲中的當前狀態,而不是 考慮了 上下文中的任何未決更改,插入或刪除。

所以我會確保MR_countOfEntitiesWithPredicate方法沒有做任何事情。也許可以嘗試在您的環境中調用標準- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error: (NSError **)error方法並查看返回結果。

+0

嘿邁克。謝謝你的提示。神奇記錄實際上是觸發2個上下文保存通知。我正在使用這些通知來觸發與Web服務的同步,結果是我無意中結束了每個創建的2個卡對象。然後提取請求獲取錯誤卡的數據並以零事務結束。 –

相關問題