2011-07-06 44 views
5

我的Core Data應用程序中有一個奇怪的問題。核心數據保存問題:無法更新可變形屬性(NSArray)

我在我的應用程序中有三個實體,但今天我發現其中一個問題。我的問題實體叫做Invoice,它有很多屬性,包括Products。它編碼NSDictionaries的NSArray(通過默認的NSValueTransformer)。

一切工作正常 - 我創建我的發票,其客戶端,其產品等一切正常。

但是,當我從列表中選擇我的發票,然後嘗試編輯其產品並點擊「保存」按鈕時,我的保存工作,直到我的應用程序終止。

問題是隻有我的products數組 - 其餘(如付款日期,客戶端等)保存。


我在做什麼

我通過我的Invoice對象通過

NSManagedObject *inv = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
invoiceEditor.invoice = inv; 

,救救我的數據(在我InvoiceEditor VC):

[self.invoice setValue:client forKey:@"Client"] // NSDictionary; 
[self.invoice setValue:products forKey:@"Products"] // NSArray of NSDictionaries; 
[self.invoice setValue:pmDate forKey:@"PaymentDate"] // NSDate; 
// other attributes 
NSManagedObjectContext *context = self.invoice.managedObjectContext; 
NSError *error = nil; 
if (![context save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

萬物節省直到被終止:客戶,公關產品,日期。但是隻有產品在終止後「重新設置」。

有人嗎?

+0

說明:你的意思是「產品是'重新設置'」?你的意思是產品屬性沒有保存?你的意思是它恢復到以前的值?換句話說,重啓後'***產品'屬性看到的是什麼,以及你實際上看到了什麼? – TechZen

+0

任何特定的原因你沒有使用一個實體和關係,而不是NSArray中的一堆NSDictionary對象?這是一個非常麻煩和(很可能)很慢的設置。 – TechZen

+0

1.我的意思是產品屬性已保存,但在我的應用程序終止後,它返回到先前的值。 2.我不使用關係,因爲我始終需要產品,即使用戶已經刪除了它們。我有一個名爲「產品」的實體,但在我的「發票」中,我正在存儲其副本。 – akashivskyy

回答

4

剛剛發現問題。從Model Object Implementation Guide

如果你用它來表示屬性,如NSArray的和一類的可變和不可變版本的NSMutableArray,你通常應該聲明的返回值獲得訪問作爲一個不可變對象,即使在內部該模型使用可變對象。

而且我products陣列實際上是一個NSMutableArray實例。我通過複製products解決了它(所以我將可變數組轉換爲不可變數組)。現在它可以工作。 :)我不需要開始賞金...

+0

我正在絞盡腦汁,爲什麼瘋狂的實現細節會導致你看到的效果。爲什麼這個行爲對於一個可變數組來說是不同的,這個可變數組是多態的,因此需要在運行時區別特定的動作?甚至更有趣 - 爲什麼是短暫的結局?! – hatfinch

+0

我不知道這是爲什麼。我不在乎,我的應用程序只是工作! :P – akashivskyy

+1

我想這個世界上有兩種程序員:那些只想讓他們的代碼工作的人,以及那些想明白爲什麼要這麼做的人。 – hatfinch

0

的確,你剛剛發現了這個問題。抱歉,我剛剛閱讀了您的問題,但CoreData在保存期間遇到了一些問題。

CoreData實體中的每個屬性都必須是不可變對象。