1

私は本当にこの2つのことで立ち往生しています。

私がやろうとしていること:

  1. 私のエンティティは単純です。それは「記録」です。
  2. 「名前(NSString)」と「親(relationShip)」があります
  3. 「親」はそれ自体、エンティティ「レコード」に接続します。

さて、「parentRecord」と「simpleRecord」を作成したいと思います。

私はそのコードでやろうとしています:

 groupRecord = (record *)[NSEntityDescription insertNewObjectForEntityForName:@"record" 
                                      inManagedObjectContext:self.managedObjectContext];
 groupRecord.name = GroupTextField.text;
 [self saveContext];

それは「parentRecord」です。将来の使用のために保存し、「groupRecord」変数でキャッチします。

次に、「simpleRecord」を作成する必要があります。これはコードです:

record *newRecord = (record *)[NSEntityDescription 
       insertNewObjectForEntityForName:@"record" 
       inManagedObjectContext:self.managedObjectContext]; 
newRecord.name = textField.text;
[newRecord setMyParent:groupRecord]; //and it crashes here!

このコードを整理したので、「parentRecord」では*は行いません。[self saveContext];variable から使用するだけですgroupRecord。そして、「childRecord」ブロックに保存します。その後、すべて問題ありません。レコードはストレージに保存され、そこから読み取ることができます。

なぜそれが起こるのですか?最初に「parentRecord」を作成し、それを保存してから「childRecord」を作成したい場合はどうすればよいですか?

以前に保存したオブジェクトを使用できないのはなぜですか? NSManagedObjectContext は同じです - 何が問題なのですか?

私は「古典的な」SQL で十分ですが、Core Data は私の脳を殺しつつあります。

みんなありがとう。


アップデート:

見てください、saveContext はクラッシュする理由がありません。ここは:

  1. 親エンティティを作成します。
  2. appDelegate の変数に設定します。
  3. コンテキストを保存します (親の場合)。
  4. childEntity を作成します。
  5. appDelegate の変数からparentPropertyを設定します。アプリがクラッシュします!

と:

  1. 親エンティティを作成します。
  2. appDelegate の変数に設定します。
  3. ///////////コンテキストを保存します (親用)。
  4. childEntity を作成します。
  5. appDelegate の変数からparentPropertyを設定します。クラッシュはありません。
  6. 今回はコンテキストを保存します。
  7. 今は大丈夫です。

親プロパティ - プロパティの名前です。MOM ファイルの親の追加設定ではありません。

階層を持つエンティティを実行したい。Xcodeが私のために作成する追加のメソッドはありません-単なるプロパティです。

4

2 に答える 2

1

さて、次のような単純なデータ モデル (疑似コード) があるように思えます。

Record{
    name:string
    parent-->Record
}

相互関係がないので危険です。これにより、オブジェクトが孤立し、オブジェクト グラフの整合性が損なわれる可能性があります。代わりに次を使用します。

Record{
    name:string
    parent<--(optional)-->Record.child
    child<--(optional)-->Record.parent
}

これで、配列やセットのような単純な 1 次元の連結リストができました。一番上のレコード オブジェクトを除いて、すべてのレコード オブジェクトには親があり、一番下のオブジェクトにはそれぞれ子があります。それぞれに 1 つを割り当てるには、次のようにします。

Record *firstRec; //assuming you have created a custom class for Record
Record *secRec;
firstRec=[NSEntityDescription insertNewObjectForEntityForName:@"Record" 
                                       inManagedObjectContext:self.managedObjectContext];
//-------------------------------------^
secRec=[NSEntityDescription insertNewObjectForEntityForName:@"Record" 
                                       inManagedObjectContext:self.managedObjectContext];
//-------------------------------------^
firstRec.name=someText;
secRec,name=someOtherText;

firstRec.child=secRec;
[self saveContext];

各親が複数の子を持つことができるツリー構造が必要な場合は、次のようなオブジェクト モデルがあります。

Record{
    name:string
    parent<--(optional)-->>Record.child
    child<<--(optional)-->Record.parent
}

挿入と割り当ては次のように変更されます。

Record *firstRec;
Record *secRec;
firstRec=[NSEntityDescription insertNewObjectForEntityForName:@"Record" 
                                       inManagedObjectContext:self.managedObjectContext];
//-------------------------------------^
secRec=[NSEntityDescription insertNewObjectForEntityForName:@"Record" 
                                       inManagedObjectContext:self.managedObjectContext];
//-------------------------------------^
firstRec.name=someText;
secRec.name=someOtherText;
[firstRec.addChildObject:secRec];
// or
secRec.parent=firsRec;

[self saveContext];

その理由は、対多関係には、設定する新しいオブジェクトを追加するメソッドが必要だからです。これは、単純な割り当てでは実行できません。ただし、子には親が 1 つしかないため、単純な代入を使用できます。この関係は相互的なものであるため、1 つのオブジェクトに割り当てると、関係の反対側のオブジェクトに自動的に割り当てられます。

それがどのように機能するかです。表示されているエラーは、オブジェクト モデルが間違っていることが原因である可能性が最も高いです。次のような 1 対 1 の必要な関係がある場合:

Record{
    name:string
    parent<--(required)-->Record.child
    child<--(required)-->Record.parent
}

... 親または子のいずれかが見つからない場合、保存しようとすると問題が発生します。同様に、複数のオブジェクトを 1 対 1 の関係に割り当てようとすると、表示されているエラーが発生する可能性があります。

挿入時にキャストを使用しないでください。割り当てられたクラスとキャスト クラスが一致しない場合、ランタイムが他のクラスをキャストに強制し、あらゆる種類の奇妙なエラーが発生するためです。

オブジェクト モデルが表示されないため、問題が何であるかを正確に言うことはできません。ただし、これは正しい方向に向ける必要があります。

于 2010-11-14T18:37:24.313 に答える
0

「saveContext」と「setMyParent」のコードを教えてください。

NSManagedObjectContext には -(BOOL)save:(NSError**)error メソッドがあります。それは「saveContext」内で呼び出されていますか?

また、関係が「親」と呼ばれる場合は、Record.h ファイルで宣言される -addParentObject: ... のような関係を設定する必要があります。特定の順序で処理を行う場合、Xcode がこれを行います。それ以外の場合は、メソッド宣言を自分で記述する必要があります。

于 2010-11-13T02:12:28.030 に答える