
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中有多个实体并且它们是相关的(多对数,反向等等),那么在世界上我将如何在代码中连接它们,就像上面的例子一样,没有那个漂亮的Xcode编辑器,您通过几次鼠标点击建立关系?
例
想象一下,我们有一个MyCustomElement类,它与上面代码中的MyCustomEntry几乎相同.现在,这是他们的界面,如果我使用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以及如何初始化它?
解决方法 关系由NSRelationshipDescription对象描述.以下代码为“MyCustomEntry”,“MyCustomElement”创建了两个关系实体描述>条目(MyCustomElement – > MyCustomEntry,to-many),
> element(MyCustomEntry – > MyCustomElement,to-one),条目的反转.
两个实体都只有一个字符串属性“IDentifIEr”(用于保存一些代码行).
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]];
Swift(现在更新为Swift 3/4):
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 = entryentrIEsRelation.minCount = 0entrIEsRelation.maxCount = 0 // max = 0 for to-many relationshipentrIEsRelation.deleteRule = .cascadeDeleteRuleentrIEsRelation.inverseRelationship = elementRelationelementRelation.name = "element"elementRelation.destinationEntity = elementelementRelation.minCount = 0elementRelation.maxCount = 1 // max = 1 for to-one relationshipelementRelation.deleteRule = .nullifyDeleteRuleelementRelation.inverseRelationship = entrIEsRelationentry.propertIEs = [entryIDAttribute,elementRelation]element.propertIEs = [elementIDAttribute,entrIEsRelation]let mom = NSManagedobjectModel()mom.entitIEs = [entry,element]
我已经测试了这段代码,它似乎有效,所以我希望它对你有用.
总结以上是内存溢出为你收集整理的objective-c – 在NSManagedObjectModel中添加关系,以编程方式创建NSEntityDescription全部内容,希望文章能够帮你解决objective-c – 在NSManagedObjectModel中添加关系,以编程方式创建NSEntityDescription所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)