objective-c – 在NSManagedObjectModel中添加关系,以编程方式创建NSEntityDescription

objective-c – 在NSManagedObjectModel中添加关系,以编程方式创建NSEntityDescription,第1张

概述当你编写一个使用CoreData的静态库时,包含一个普通的.xdatamodeld文件会进入项目,因为你不能只将它的编译版本(.momd)链接到你的二进制文件中,所以最好在代码中创建整个NSManagedObjectModel喜欢这个: NSAttributeDescription *dateAttribute = NSAttributeDescription.new;dateAttribut 当你编写一个使用CoreData的静态库时,包含一个普通的.xdatamodeld文件会进入项目,因为你不能只将它的编译版本(.momd)链接到你的二进制文件中,所以最好在代码中创建整个NSManagedobjectModel喜欢这个:

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1034099.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存