- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当你编写一个使用 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,对多),element
(MyCustomEntry --> MyCustomElement,一对一),entries
的倒数。两个实体都只有一个字符串属性“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 = 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]
我已经测试了这段代码,它似乎可以工作,所以我希望它对你有用。
关于objective-c - 将 NSManagedObjectModel 中的关系添加到以编程方式创建的 NSEntityDescription,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13743242/
此问题源自 previous question 。 当我运行以下代码行时: NSEntityDescription *outputCellEntityDescription = [NSEntityDe
现在我有一个核心数据实体“AAA”,我使用一种方法来获取它的结果: - (AAA *)result{ NSEntityDescription *Entity = [NSEntityDescrip
我有一个名为“录音”的具有一对多关系的用户实体。 生成的界面是这样的: @interface User : NSManagedObject @property (nonatomic, retain)
就结果而言,以下两种方法之间有什么区别: + (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectCon
我的变量 entityDescription 似乎是 nil,所以我在编译时出现 fatal error 。有谁知道解决方案? persistentContainer 在同一个类 (AppDelega
我有一个 CoreData在根 View Controller 上工作的数据库。我有第二个 UIViewController其中当我切换到,并使用相同的行来获取 NSEntityDescription
我有一个 NSTreeController (treeController) 和一个 CoreData 数据库。我想要 NSTreeController 所选对象后面的实体。 我用它来获取正确的 NS
从苹果的例子中,我有这个: Event *event = (Event*)[NSEntityDescription insertNewObjectForEntityForName:@"Even
错误 我今天第一次开始使用 CoreData,但一直遇到这个错误。 线程 1:“'MenuRPG.Inventory' 类的 NSManagedObject 必须具有有效的 NSEntityDescr
错误 我今天第一次开始使用 CoreData,但一直遇到这个错误。 线程 1:“'MenuRPG.Inventory' 类的 NSManagedObject 必须具有有效的 NSEntityDescr
我的 iPhone 应用程序上的 Core Data 有问题。每次我尝试使用 NSEntityDescription 调用方法时,我都会得到一个 objc_exception_throw()(我在符号
我知道这是其他问题的重复,但我已经按照这些问题的答案进行操作,但仍然遇到相同的错误。 我认为错误是因为代码在数据还没有保存时就试图获取数据(保存数据有延迟,因为我是从 Parse 获取数据的)。有
我想从核心数据中删除所有 NSEntityDescription 对象并释放内存。 reset 函数对内存没有任何影响 以下是我的代码 -(void)generatePersons: (NSManag
我已经针对 SO 上的类似问题尝试了建议的解决方案,但没有成功。提取请求找不到实体名称“GarmentType”。 这是我的数据模型: 错误是在这个帮助类中的 executeFetchRequest
我已经为此苦苦思索了太久。我有两个 ViewController 试图使用 NSEntityDescription,一个可以,一个不能(给我上面的错误)。 两个 ViewControllers 都导入
我对 Xcode 分析器的评论感到困惑。我在 Stack 上搜索过,但没有真正找到类似的情况。我有一个 CoreData/SQLite 应用程序,用户在表中选择一条记录,获取该实体的所有属性。然后,根
正如您在标题中看到的,我收到一个 Sigabrt 错误,该类必须具有有效的 NSEntityDescription。我的答案是我必须添加到我的项目中以及我必须在哪里实现它。如果这是一个显而易见的问题,
为了测试托管类,我尝试通过首先尝试模拟 NSEntityDescription 和 NSManagedObjectContext 在单元测试中创建一个实例。 id mockEntityDesc = [
我正在尝试使用我的 Xcode 项目设置核心数据,但遇到了一个我似乎无法摆脱的错误。我在 StudyHub.xcdatamodeld 中有一个名为 UserDetails 的实体。我在 AppDele
我有一位使用 iPad 2 的客户遇到了崩溃,我无法重现它。 崩溃报告: Last Exception Backtrace: 0 CoreFoundation 0
我是一名优秀的程序员,十分优秀!