1

私は個人と会社のNSManagedObjectsをサブクラス化しました。コアデータでは、これらを双方向の関係で設定しました(1つはpersonCompanyと呼ばれる個人から会社へ、もう1つはcompanyPersonの周り)。私のアプリは人と会社の両方を美しく保存します。それらのヘッダーファイルは次のようになります(デモ用に大幅に簡略化されています)。

#import <CoreData/CoreData.h>

@interface BBPerson : NSManagedObject

@property (nonatomic) NSString *firstName;
@property (nonatomic) NSString *lastName;

@end

----------------------

#import <CoreData/CoreData.h>

@interface BBCompanyName : NSManagedObject

@property (nonatomic) NSString *companyName;

@end

私の「AddPerson」ビューコントローラでは、saveメソッドの一部を以下に示します。

    //If this is a new person, best add a person
    if (!currentPerson) {
        currentPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
                                                         inManagedObjectContext:managedObjectContext];
    }

    //Write the values back to the entity

    currentPerson.firstName = txtFirstName.text;
    currentPerson.lastName = txtLastName.text;

**//I WANT TO DO THE BELOW: but clearly can't**    
//[currentPerson setCompany:selectedCompany];.

    //Save back to core data
    NSError *error;
    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save - error: %@", [error localizedDescription]);
    }

ここで参照されている別の会社(上記ではselectedCompanyとして表示)がある場合、サブクラス化されたNSManagedObjectを変更してこの関係を追加するにはどうすればよいですか?私はドキュメンテーションを見ました、そして、私はまだ少し漂流しています。

サブクラス化されたNSManagedObjectを使用して私が行おうとしているのは、永続化できる関係を作成することです。[currentPerson setCompany:selectedCompany]のようなもの; もちろん、これはcurrentPersonにメソッドを必要とします-このメソッドはどのように見えますか?

私がやりたいのは、アプリの後の段階で、すべての人を会社に呼び戻すことです。述語と外部キーと溝の関係を使用してこれを行うことを考えましたが、これはデータベースであり、そうではないという誤った考え方に陥っています。

4

1 に答える 1

1

コアデータエディターでエンティティを設定する必要があります(プロジェクトナビゲーターでxcdatamodelを選択すると表示されます)。

PersonエンティティとCompanyエンティティの両方にname、phoneNumberなどの属性を追加します。

次に、Companyエンティティの場合、リレーションシップの下に、名前people、destinationPersonとのリレーションシップを追加します。その関係を選択した状態で、データモデルインスペクターペインで、to-many関係を示すボックスにチェックマークを付けます。Personエンティティの場合、companyという関係を追加し、宛先をCompanyに設定し、その逆をPersonに設定します。

NSManagedObjectModelサブクラスをプロジェクトナビゲーターから削除します。新しいファイルを作成し、左側のメニューから[コアデータ]を選択します。管理対象サブクラスを選択します。エンティティを生成するデータモデルを尋ねられます。データモデルと、NSManagedObjectサブクラスを生成するエンティティ(PersonおよびCompany)を選択します。

次に、Xcodeが作成するヘッダーファイルと実装ファイルを確認すると、エンティティに設定した属性がヘッダーファイルでプロパティとして宣言されており、実装ではすべて動的としてマークされていることがわかります。さらに重要なことに、会社と個人の間の1対多の関係についても同じことが言えます。Company.hで、会社にはNSSetである@property人がいることがわかります。これは、実装で@dynamicとマークされています。@dynamicは、@ synthesizeのようにゲッターとセッターを作成しませんが、ドット表記を使用することはできます。

また、コアデータがいくつかのアクセサメソッドを生成することに注意してください。

于 2012-10-25T20:26:03.153 に答える