2011-07-06 1 views
5

내 핵심 데이터 앱에 이상한 문제가 있습니다.코어 데이터 저장 문제 : 변환 가능한 속성 (NSArray)을 업데이트 할 수 없습니다.

내 앱에는 세 개의 항목이 있지만 오늘은 그 중 하나에 문제가 있음을 발견했습니다. 내 문제가있는 엔티티는 Invoice이며 Products을 비롯한 많은 특성이 있습니다. 그것은 NSDictionaries의 NSArray를 인코딩합니다 (디폴트 NSValueTransformer를 통해).

모든 것이 잘 작동합니다. 인보이스, 고객, 제품 등을 만듭니다. 모든 것이 작동합니다. 내 응용 프로그램이 종료 될 때까지

그러나, 나는 목록에서 내 송장을 선택하고 제품을 편집하고 '저장'버튼을 클릭하려고 내 저장에만 작동합니다.

products 배열에만 문제가 있습니다. 나머지는 (예 : 결제일, 클라이언트 등) 저장합니다.


내가

내가

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

를 통해 내 Invoice 개체를 전달 그리고 (내 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(); 
} 

Everythings 세이브 해지 될 때까지 : 클라이언트, 홍보 oducts, 날짜. 그러나 종료 후에 제품 만 '재설정'됩니다.

아무도 없습니까?

+0

설명 : "제품이 '재설정되었습니다'라는 것은 무엇을 의미합니까? 제품 속성이 저장되지 않았다는 것을 의미합니까? 이전 값으로 되돌아 간다는 것을 의미합니까? 다시 말해서, ***는 *** 제품이 다시 시작된 후 'products' 속성을 볼 것을 기대하고 *** 실제로 *** 무엇을합니까? – TechZen

+0

NSArray 내부에 NSDictionary 객체가 아니라 엔티티와 관계를 사용하지 않는 특별한 이유가 있습니까? 이는 매우 성가시고 (가장 가능성이있는) 느린 설정입니다. – TechZen

+0

1. 제품 속성이 저장되지만 내 앱이 종료되면 이전 값으로 돌아갑니다. 2. 사용자가 삭제 한 경우에도 항상 제품이 필요하므로 관계를 사용하지 마십시오.'제품'이라는 엔티티가 있지만 'Invoice'에 사본을 저장하고 있습니다. – akashivskyy

답변

4

방금 ​​문제가 발견되었습니다. Model Object Implementation Guide에서 : 당신이있는 NSArray와 같은 속성-등을 표현하는 데 사용하는 클래스의 가변 및 불변 버전이있는 경우

있는 NSMutableArray가 - 당신은 일반적으로 불변의 객체로 접근 얻을의 반환 값을 선언해야 심지어 내부적 경우 모델은 변경 가능한 객체를 사용합니다.

그리고 내 products 배열은 실제로 NSMutableArray 예를했다. 나는 products을 복사하여 그것을 해결했다 (그래서 나는 가변 배열을 불변 배열로 변환했다). 이제 작동합니다. :) 그리고 현상금을 시작할 필요가 없었습니다 ...

+0

어떤 미친 종류의 구현 세부 사항이 당신이보고있는 효과로 이어질 지에 관해서는 두뇌가 벅차 오르고 있습니다. 변경 불가능한 배열에 다형성을 갖는 가변 배열에 대해 동작이 다른 이유는 무엇입니까? 따라서 런타임에 고유 한 동작을 구별해야합니까? 그리고 더욱 흥미로워지는 이유는 무엇입니까? – hatfinch

+0

왜 그런지 모르겠습니다. 그리고 상관 없어, 내 애플 리케이션은 그냥 작동! : P – akashivskyy

+1

나는이 세상에 두 종류의 프로그래머가 있다고 생각한다 : 단지 코드가 작동하기를 원하는 사람들과 이유를 이해하려는 사람들이다. – hatfinch

0

실제로 문제를 발견했습니다. 죄송 합니다만 문제를 읽었지만 CoreData는 저장 중에 몇 가지 문제가 있습니다.

CoreData 엔티티의 각 속성은 변경 불가능한 객체 여야합니다.

관련 문제