私が正しい道を進んでいるかどうか、誰かが教えてくれるかもしれません。
私は2つのエンティティを持っています:
次の属性を使用して 演習を行います: title - string ; エクササイズID - 整数
次の属性を持つ追加された演習: count - int ; added_exercise_id - int
addedExerciseには、 destination: Exercise および predicate: exercise_id == $FETCH_SOURCE.added_exercise_idを持つ link_exerciseというフェッチされたプロパティがあります。
私のコードでは、次のことを行います。
for(AddedExercise *e in listOfAddedEx){
[moc refreshObject:e mergeChanges:YES];
NSLog(@"%@", e.link_exercise);
}
ログには次のように書かれています。
()、name link_exercise、isOptional 1、isTransient 1、entity AddedExercise、renamingIdentifier link_exercise、validation predicate ( )、warnings ( )、versionHashModifier (null) userInfo { }、fetchRequest (entity: Exercise; predicate: (exercise_id == $FETCH_SOURCE.added_exercise_id); sortDescriptors: ((null)); タイプ: NSManagedObjectResultType; ) on 0x1700d8b80
そのため、何かがそこにあり、障害で表されているようです。しかし、「link_exercise」配列にアクセスしようとすると。例: e.link_exercise.countまたはe.link_exercise.lastObject
次のエラーが表示されます。
「NSUnknownKeyException」、理由:「[<_NSCoreDataTaggedObjectID 0xd000000000040002> valueForUndefinedKey:]: このクラスは、キー added_exercise_id のキー値コーディングに準拠していません。」
多分誰かがそれを解決する方法を考えています。
よろしくお願いします。
SR
-----> 更新 1:
述語を次のように変更しました: SELF.exercise_id=exercise_id
これで、 Exerciseオブジェクトにアクセスできますが、ID が間違っています。
SELF.exercise_id=exercise_idはSELF.exercise_id= added_exercise_idのようになります
述語SELF.exercise_id= added_exercise_idを使用すると、次のエラーが発生します。
「NSInvalidArgumentException」、理由: 「述語 (exercise_id == added_exercise_id) の SQL を生成できません (RHS の問題)」
-----> 更新 2:
動かない原因が未だにわかりません…
私にとっては
SELF.exercise_id == $FETCH_SOURCE.added_exercise_id
正しい述語である必要がありますが、機能しません。多分他の誰かがいくつかの提案を持っています...?
または、自分で (プログラムで) フェッチ要求を作成する必要がありますか? つまり、すべての「Exercise」にフェッチ リクエストを設定し、exercise_id = added_exercise_id の 1 つを返します。これは基本的に、フェッチされたプロパティを介して現在解決しようとしているものです。
-----> 更新 3: OK 私はほぼそれを持っています!! 言い忘れたことの 1 つは、マルチ managedObjectContext コア データ スタック (worker-、main-master-context を含む) を使用することです。
masterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
masterContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[masterContext setPersistentStoreCoordinator: coordinator];
mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
mainContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
mainContext.parentContext = masterContext;
workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
workerContext.parentContext = mainContext;
私のすべてのリクエストはワーカーコンテキストに送られます(この場合、フェッチされた適切なものは機能しません)しかし、すべてのリクエストがマスターコンテキストに送られると、フェッチされたプロパティは期待どおりに機能します!!
したがって、永続ストアを持つ managedObjectContext でのみ機能するようです。
誰かが私に説明できますか、なぜこれが他の managedObjectContext では機能しないのですか?