【问题标题】:Create Relation between two entities using code in coredata iPhone使用 coredata iPhone 中的代码在两个实体之间创建关系
【发布时间】:2012-07-16 18:37:16
【问题描述】:

在代码中创建 ManageObjectModel 时,我正在创建两个实体及其属性。但问题是我如何在两个实体之间创建关系 1 到多个关系。我的代码如下。 我只想使用代码在两个员工和组织实体之间建立一对多的关系。

- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }

    __managedObjectModel = [[NSManagedObjectModel alloc] init];

    NSEntityDescription *employeeEntity = [[NSEntityDescription alloc] init];
    [employeeEntity setName:@"Employee"];
    [employeeEntity setManagedObjectClassName:@"Employee"];

    NSEntityDescription *organizationEntity = [[NSEntityDescription alloc] init];
    [organizationEntity setName:@"Organization"];
    [organizationEntity setManagedObjectClassName:@"Organization"];
    [__managedObjectModel setEntities:[NSArray arrayWithObjects:employeeEntity, organizationEntity, nil]];

    NSAttributeDescription *nameAttribute = [[NSAttributeDescription alloc] init];    
    [nameAttribute setName:@"name"];
    [nameAttribute setAttributeType:NSDateAttributeType];
    [nameAttribute setOptional:NO];    

    NSAttributeDescription *idAttribute = [[NSAttributeDescription alloc] init];    
    [idAttribute setName:@"id"];
    [idAttribute setAttributeType:NSInteger32AttributeType];
    [idAttribute setOptional:NO];

    NSArray *properties = [NSArray arrayWithObjects: nameAttribute, idAttribute, nil];
    [employeeEntity setProperties:properties];

    NSAttributeDescription *organizationNameAttribute = [[NSAttributeDescription alloc] init];
    [organizationNameAttribute setName:@"Name"];
    [organizationNameAttribute setAttributeType:NSStringAttributeType];
    [organizationNameAttribute setOptional:NO];        

    properties = [NSArray arrayWithObjects:organizationNameAttribute, nil];
    [organizationEntity setProperties:properties];

    return __managedObjectModel;
}

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    如果你真的想在代码中做,你必须创建一个NSRelationshipDescription并将它添加到源对象的属性中。

    这里是doc

    创建对象并在分配之前调用setMaxCount:。如果您查看isToMany 方法的文档,您会看到它说:

    YES if the receiver represents a to-many relationship (its maxCount is greater than 1) otherwise NO.

    【讨论】:

    • 是的,我知道我必须添加 NSRelationshipDescription 但我无法建立一对多关系,因为 ToMany 属性是只读的。请帮助我或为我编写示例代码。非常感谢
    【解决方案2】:

    这是我们从代码 (Swift 4) 配置 NSManagedObjectModel 的方式。

    public class IssueList: NSManagedObject {
    
       @NSManaged public var title: String
       @NSManaged public var issues: Set<Issue>
    }
    
    public class Issue: NSManagedObject {
    
       @NSManaged public var title: String
       @NSManaged public var issueList: IssueList
    }
    
    class PCDBStack: DBStack {
    
       override func setupModel() -> NSManagedObjectModel {
    
          let issueListEntity = makeIssueListEntity()
          let issueEntity = makeIssueEntity()
    
          // To-many relationship from "IssueList" to "Issue"
          let issueListToIssueRelation = NSRelationshipDescription()
    
          // To-one relationship from "Issue" to "IssueList"
          let issueToIssueListRelation = NSRelationshipDescription()
    
          issueListToIssueRelation.name = #keyPath(IssueList.issues)
          issueListToIssueRelation.minCount = 0
          issueListToIssueRelation.maxCount = 0 // max = 0 for to-many relationship
          issueListToIssueRelation.deleteRule = .cascadeDeleteRule
          issueListToIssueRelation.destinationEntity = issueEntity
          issueListToIssueRelation.inverseRelationship = issueToIssueListRelation
    
          issueToIssueListRelation.name = #keyPath(Issue.issueList)
          issueToIssueListRelation.minCount = 0
          issueToIssueListRelation.maxCount = 1 // max = 1 for to-one relationship
          issueToIssueListRelation.deleteRule = .nullifyDeleteRule
          issueToIssueListRelation.destinationEntity = issueListEntity
          issueToIssueListRelation.inverseRelationship = issueListToIssueRelation
    
          issueListEntity.properties.append(issueListToIssueRelation)
          issueEntity.properties.append(issueToIssueListRelation)
    
          let model = NSManagedObjectModel()
          model.entities = [issueEntity, issueListEntity]
          return model
       }
    
       private func makeIssueListEntity() -> NSEntityDescription {
    
          let attributeTitle = NSAttributeDescription()
          attributeTitle.name = #keyPath(IssueList.title)
          attributeTitle.attributeType = .stringAttributeType
          attributeTitle.isOptional = false
    
          let entityDescription = NSEntityDescription()
          entityDescription.name = IssueList.entityName
          entityDescription.managedObjectClassName = IssueList.entityClassName
          entityDescription.properties = [attributeTitle]
    
          return entityDescription
       }
    
       private func makeIssueEntity() -> NSEntityDescription {
    
          let attributeTitle = NSAttributeDescription()
          attributeTitle.name = #keyPath(Issue.title)
          attributeTitle.attributeType = .stringAttributeType
          attributeTitle.isOptional = false
    
          let entityDescription = NSEntityDescription()
          entityDescription.name = Issue.entityName
          entityDescription.managedObjectClassName = Issue.entityClassName
          entityDescription.properties = [attributeTitle]
    
          return entityDescription
       }
    }
    

    有用的NSManagedObject 扩展:

    extension NSManagedObject {
    
        public static var entityName: String {
            let className = NSStringFromClass(self) // As alternative can be used `self.description()` or `String(describing: self)`
            let entityName = className.components(separatedBy: ".").last!
            return entityName
        }
    
        public static var entityClassName: String {
            let className = NSStringFromClass(self)
            return className
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多