XcodeでCoreデータオブジェクトに保存するとエラーが発生します。
Xcodeは、エラーはNSDate変数「datum」にあると言っていますが、私はほとんどすべてを試しました。エラー:
2011-07-12 18:01:29.068 WeekLijstje[3205:207] Core Data Save Error
NSValidationErrorKey datum
NSValidationErrorPredicate (null)
NSValidationErrorObject
<DagLijst: 0x6e2fcd0> (entity: DagLijst; id: 0x6e2fd30 <x-coredata:///DagLijst/t99F423FC-AAE9-4692-9264-EF0FF7A020572> ; data: {
Voedsel = nil;
datum = nil;
hoeveelheid = 0;
punten = 0;
})
NSLocalizedDescription:The operation couldn’t be completed. (Cocoa error 1570.)
小さなコードスニペット:
DagLijst *newDaglijst = [NSEntityDescription insertNewObjectForEntityForName:@"DagLijst" inManagedObjectContext:self.managedObjectContext];
NSDate *selDatum = [NSDate date];
newDaglijst.punten = [NSNumber numberWithInteger:10];
newDaglijst.hoeveelheid = [NSNumber numberWithInt:100];
newDaglijst.Voedsel = geselecteerdVoedsel;
newDaglijst.datum = selDatum;
NSError *error = nil;
if (![newDaglijst.managedObjectContext save:&error]) {
...
DagLijstオブジェクトのクラス:
@interface DagLijst : NSManagedObject {
@private
}
@property (nonatomic, retain) NSDate * datum;
@property (nonatomic, retain) NSNumber * punten;
@property (nonatomic, retain) NSNumber * hoeveelheid;
@property (nonatomic, retain) Voedsel *Voedsel;
@end
したがって、NSDateを 'datum'変数に入れていることがわかります。しかし、実行時にエラーが発生します。
ココアエラー1570
は、必須フィールドが入力されていないことを意味します。この場合、nil
の2つの属性があります:Voedsel
とdatum
。
私はあなたのコードに見ます:
newDaglijst.Voedsel = geselecteerdVoedsel;
newDaglijst.datum = selDatum;
geselecteerdVoedsel
とselDatum
がnilでないこと、または過剰にリリースされてnilになっていることを確認してください。オプションのデータである場合(ただしそうは思わない)、coredataでオプションとして定義します。
この助けを願って、
マイケルAが言ったように。属性値がnilでないことを確認してください。これらのエラーを取り除くには、2つの選択肢があります。ケース1:2つの属性が必要な場合
2つの属性が必須属性である場合、渡す値がnilでないことを確認することが必須です。これらのエラーから抜け出したい場合は、属性インスペクターでこれらの属性のデフォルト値を指定する必要があります。データモデルのエンティティ
ケース2:オプションのチェックマークを選択して、属性インスペクターでこれらの属性をオプションに設定します。
私も何日もこれらのエラーを知るのに苦労しました。それが誰かを助けることを願っています。
ロギングは次のようになります。
Fatal error: 'try!' expression unexpectedly raised an error:
Error Domain=NSCocoaErrorDomain Code=1560 "(null)" UserInfo={NSDetailedErrors=(
...
これは、エンティティの1つ(または複数)のプロパティにコミットされていない変更があることを意味します。このプロパティでは、オプションではないが、オプションのままにしました。
プロパティの値の設定に失敗したエンティティを見つけるには、ログでこれを探します。
UserInfo={NSValidationErrorObject=<YOURENTITYISHERE: ...>
プロパティを見つけるには、次を検索します:
NSValidationErrorKey=YOURPROPERTYISHERE
コードのどこかで、指定されたエンティティのプロパティの値を設定するのを忘れています。
他のxcdatamodeld
ファイルからエンティティをコピーしたときにこの問題が発生しました。彼らは逆属性を失ったので、それが理由でした。
Michaelの答えを補強するために、インスペクターでEntityプロパティを確認できます。アイテムの1つが誤ってオプションと見なされる場合とされない場合があります。または、あなたが私のような場合、「Delete Rule」が「Nullify」に設定されている可能性があります。これにより、実行時にエンティティの関係プロパティがNil
になります。削除するオブジェクトは他のオブジェクトと1対多の関係にあるため、親オブジェクトが削除されませんでした。これをCascade
に変更すると、問題が解決しました。
日付とはあまり関係ありませんが、エラーがあるので、この質問にはもっと多くの見方があるので、共有します
私の場合、BOOL
プロパティをYES
またはNO
として直接設定していましたが、使用する必要があります
NSNumber numberWithBOOL
それを機能させるために。