7

CoreDataを使用する静的ライブラリを作成すると、コンパイル済みのバージョン(.momd)をバイナリにリンクすることはできないため、通常の.xdatamodeldファイルをプロジェクトに含めてしまうと、NSManagedObjectModelで関係を追加してプログラムで作成したNSEntityDescription

NSAttributeDescription *dateAttribute = NSAttributeDescription.new; 

dateAttribute.name = @"timestamp"; 
dateAttribute.attributeType = NSDoubleAttributeType; 
dateAttribute.optional = NO; 
dateAttribute.indexed = YES; 

NSAttributeDescription *payloadAttribute = NSAttributeDescription.new; 

payloadAttribute.name = @"payload"; 
payloadAttribute.attributeType = NSBinaryDataAttributeType; 
payloadAttribute.optional = NO; 
payloadAttribute.indexed = NO; 

NSEntityDescription *entry = NSEntityDescription.new; 

entry.name = entry.managedObjectClassName = NSStringFromClass(MyCustomEntry.class); 
entry.properties = @[dateAttribute, payloadAttribute]; 

NSManagedObjectModel *mom = NSManagedObjectModel.new; 

mom.entities = @[entry]; 

を、すべてが完璧です....

しかし:それは、このようなコードで全体NSManagedObjectModelを作成する方が良いでしょう!私のNSManagedObjectModelに複数のエンティティがあり、それらが関連している(多対多など)場合は、上の例のようにコードでそれらを接続する方法を、素晴らしいXcodeエディタいくつかのマウスクリックでリレーションシップを作りますか?

は想像の例では、我々は上記のコードからMyCustomEntryとほぼ同じであるクラスMyCustomElementを、持っています。さて、here're私は、エンティティのためのXcodeの生成を使用した場合、彼らがどのように表示されるかそのインターフェイス:

@interface MyCustomEntry : NSManagedObject 

@property (nonatomic, retain) NSNumber *timestamp; 
@property (nonatomic, retain) NSData *payload; 
@property (nonatomic, retain) MyCustomElement *element; 

@end 

@interface MyCustomElement : NSManagedObject 

@property (nonatomic, retain) NSNumber * timestamp; 
@property (nonatomic, retain) NSString * identifier; 
@property (nonatomic, retain) NSSet *entries; 

@end 

@interface MyCustomElement (CoreDataGeneratedAccessors) 

- (void)addEntriesObject:(MyCustomEntry *)value; 
- (void)removeEntriesObject:(MyCustomEntry *)value; 
- (void)addEntries:(NSSet *)values; 
- (void)removeEntries:(NSSet *)values; 

@end 
私は彼らのために作成する必要があるとどのようにそれを初期化するためには何NSRelationshipDescription

答えて

16

関係は、NSRelationshipDescriptionオブジェクトによって記述されます。オン、> MyCustomElement - ( - 多> MyCustomEntry、MyCustomElement)、

  • element(MyCustomEntry次のコードは、関係

    • entriesと "MyCustomEntry"、 "MyCustomElement" の2つのエンティティの記述を作成します)、逆数はentriesです。

    両方のエンティティには、文字列属性 "識別子"(コードの一部の行を保存する)のみがあります。

    のObjective-C:

    NSEntityDescription *entry = [[NSEntityDescription alloc] init]; 
    [entry setName:@"MyCustomEntry"]; 
    [entry setManagedObjectClassName:@"MyCustomEntry"]; 
    
    NSAttributeDescription *entryIdAttribute = [[NSAttributeDescription alloc] init]; 
    entryIdAttribute.name = @"identifier"; 
    entryIdAttribute.attributeType = NSStringAttributeType; 
    
    NSEntityDescription *element = [[NSEntityDescription alloc] init]; 
    [element setName:@"MyCustomElement"]; 
    [element setManagedObjectClassName:@"MyCustomElement"]; 
    
    NSAttributeDescription *elementIdAttribute = [[NSAttributeDescription alloc] init]; 
    elementIdAttribute.name = @"identifier"; 
    elementIdAttribute.attributeType = NSStringAttributeType; 
    
    // To-many relationship from "Element" to "Entry": 
    NSRelationshipDescription *entriesRelation = [[NSRelationshipDescription alloc] init]; 
    
    // To-one relationship from "Entry" to "Element": 
    NSRelationshipDescription *elementRelation = [[NSRelationshipDescription alloc] init]; 
    
    [entriesRelation setName:@"entries"]; 
    [entriesRelation setDestinationEntity:entry]; 
    [entriesRelation setMinCount:0]; 
    [entriesRelation setMaxCount:0]; // max = 0 for to-many relationship 
    [entriesRelation setDeleteRule:NSCascadeDeleteRule]; 
    [entriesRelation setInverseRelationship:elementRelation]; 
    
    [elementRelation setName:@"element"]; 
    [elementRelation setDestinationEntity:element]; 
    [elementRelation setMinCount:0]; 
    [elementRelation setMaxCount:1]; // max = 1 for to-one relationship 
    [elementRelation setDeleteRule:NSNullifyDeleteRule]; 
    [elementRelation setInverseRelationship:entriesRelation]; 
    
    [entry setProperties:@[entryIdAttribute, elementRelation]]; 
    [element setProperties:@[elementIdAttribute, entriesRelation]]; 
    
    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] init]; 
    [mom setEntities:@[entry, element]]; 
    

    スウィフト:

    let entry = NSEntityDescription() 
    entry.name = "MyCustomEntry" 
    entry.managedObjectClassName = "MyCustomEntry" 
    
    let entryIdAttribute = NSAttributeDescription() 
    entryIdAttribute.name = "identifier"; 
    entryIdAttribute.attributeType = .StringAttributeType; 
    
    let element = NSEntityDescription() 
    element.name = "MyCustomElement" 
    element.managedObjectClassName = "MyCustomElement" 
    
    let elementIdAttribute = NSAttributeDescription() 
    elementIdAttribute.name = "identifier" 
    elementIdAttribute.attributeType = .StringAttributeType 
    
    // To-many relationship from "Element" to "Entry": 
    let entriesRelation = NSRelationshipDescription() 
    
    // To-one relationship from "Entry" to "Element": 
    let elementRelation = NSRelationshipDescription() 
    
    entriesRelation.name = "entries" 
    entriesRelation.destinationEntity = entry 
    entriesRelation.minCount = 0 
    entriesRelation.maxCount = 0 // max = 0 for to-many relationship 
    entriesRelation.deleteRule = .CascadeDeleteRule 
    entriesRelation.inverseRelationship = elementRelation 
    
    elementRelation.name = "element" 
    elementRelation.destinationEntity = element 
    elementRelation.minCount = 0 
    elementRelation.maxCount = 1 // max = 1 for to-one relationship 
    elementRelation.deleteRule = .NullifyDeleteRule 
    elementRelation.inverseRelationship = entriesRelation 
    
    entry.properties = [entryIdAttribute, elementRelation] 
    element.properties = [elementIdAttribute, entriesRelation] 
    
    let mom = NSManagedObjectModel() 
    mom.entities = [entry, element] 
    

    私はこのコードをテストしているし、動作しているようですので、私はそれがあなたに有用であろうことを願っています。

  • +0

    更新された質問を例で確認してください。 – shoumikhin

    +0

    @shoumikhin:答えにサンプルコードを追加しました。 –

    +0

    素晴らしい、ありがとう! – shoumikhin

    関連する問題