2011-09-29 24 views
0

我有三個類,A,B和C. A是主類。iPhone核心數據 - 不能履行故障錯誤

當用戶想要查看所購買的所有對象的列表時,將從A中調用B類,並顯示核心數據實體中的對象列表。

在B類內部,用戶可以購買新對象(應用內購買)。當用戶想要購買另一個對象時,就會調用C類。

當C類被調用時,則使用

anObject = [NSEntityDescription insertNewObjectForEntityForName:@"Objects" inManagedObjectContext:context]; 

那麼這個對象被分配給有關類別C的本地參考,使用類似

self.object = anObject; 
核心數據實體創建一新的對象

這個對象變量是這樣聲明的:

.h 
MyObjects *object; 
@property (nonatomic, retain) MyObjects *object; 

and @synthesized on .m 

MyObjects是一個核心數據c lass代表實體。

從理論上講,對象將保留任何分配給它的對象,所以行self.object = anObject我之前輸入的將保留self.object上的對象引用,對嗎?

問題是,當我嘗試在購買新對象後訪問同一類中的self.object時,收到錯誤「CoreData無法完成XXX的錯誤」,其中XXX正好是self.object。

代碼中沒有任何對象從數據庫中刪除。對於我能識別的數據庫唯一的操作是在崩潰之前的另一個課程完成的保存操作。保存是通過類似

if (![self.managedObjectContext save:&error]) ... 

是否有任何關係?可能是什麼原因造成的?

回答

3

CoreData管理被管理對象的生命週期,你不應該保留和釋放它們。如果您想保留對該對象的引用以便稍後可以檢索該對象,則必須存儲對象的ID(使用 - [NSManagedObject objectID]獲取)。然後使用它來稍後使用 - [NSManagedObjectContext objectWithID:]來檢索對象。

確保您瞭解CoreData錯誤。閱讀documentation

+0

好。現在我正在做你說的話。我在創建對象時保存objectID引用,然後使用objectWithID檢索它,並且它仍然在同一行中崩潰,也就是說,在檢索對象後我正好嘗試設置其屬性。 – SpaceDog

+1

我們將需要查看當您存儲id時的代碼,然後再檢索該對象。 –

+0

問題是這樣的:如果我打印控制檯使用objectWithID檢索它後得到的對象是這樣的:** (entity:Objects; id:0x1b6ca0 ; data:)**,我認爲是一個錯誤。現在的問題是我如何「無故」...... – SpaceDog

2

前幾天我有一個類似的問題(使用NSFetchedResultsController),我將fetchedObjects放入數組並收集屬性以從數組對象填充表。看起來,如果數組中的對象發生故障,除非您正在對直接對象進行操作,否則您不能將其設爲非故障。在我的情況下,我通過採用有問題的代碼行並調用[[_fetchedResultsController objectAtIndexPath:indexPath] someAttribute]來解決問題。我會假設做類似的事情也會解決你的問題。看起來有點乏味,需要從managedObjectContext獲取一個錯誤的值,但這是我親自過過這個問題的唯一方法。

+0

謝謝。你能翻譯一下嗎? 「陣列中的物體有故障」是什麼意思?爲什麼會發生這種情況?你的意思是我的self.object可以指向一個無效的對象,即使被保留,也沒有操作來刪除它嗎?我無法理解這一點。謝謝。 – SpaceDog

+1

對不起,我感到困惑。爲了節省內存,不用時核心數據屬性和關係經常出現故障。簡而言之,屬性被壓縮。你得到的錯誤並不是說你的核心數據對象已經不存在了(它仍然存在於你的數據庫中),只是它無法讀取關於它的特定信息,因爲它不能錯誤的屬性,核心數據必須做的事情。 [這個錯誤指南](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html)給出了一個很好的例子,它是什麼意思,當數據出現故障 – justin

+0

所以,我如何再次訪問對象?我已經按照Robin的建議完成了,也就是說,我存儲了對象的objectID,然後當我想要檢索該對象時,我使用objectWithID獲取它,但是我得到的對象再次出現故障。 – SpaceDog

1

核心數據負責管理內存中被管理對象的生命週期。瞭解管理對象上下文非常重要 - 閱讀documentation

Apple還提供了一個完整的故障排除部分here,它除其他外包含導致錯誤的原因。但是,只有瞭解核心數據的工作原理,它纔有用。

0

最有可能的錯誤是您保存的對象不屬於託管對象上下文。如果你在不同的線程上使用同一個對象,並且這些不同的線程使用不同的託管對象上下文,那麼這將會發生。