2017-06-14 89 views
0

我有两个实体Device和MDM。设备有两个属性,asset_tag和location。 MDM有两个属性,asset_tag和os。我正在尝试为每个asset_tag设备获取asset_tag,os和位置。我有Xcode中创建我的子类:核心数据Swift 3关系

extension Device { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Device> { 
     return NSFetchRequest<Device>(entityName: "Device") 
    } 

    @NSManaged public var asset_tag: String? 
    @NSManaged public var location: String? 
    @NSManaged public var devices: MDM? 

} 

extension MDM { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<MDM> { 
     return NSFetchRequest<MDM>(entityName: "MDM") 
    } 

    @NSManaged public var asset_tag: String? 
    @NSManaged public var os: String? 
    @NSManaged public var mdms: Device? 

} 

我取的请求如下:

var request = NSFetchRequest<NSFetchRequestResult>() 
      request = Device.fetchRequest() 
      request.returnsObjectsAsFaults = false 
let results = try context.fetch(request) as! [Device] 

不知道如何得到这样的device.mdms.os合作,获取特定设备的操作系统。

+0

正如另一个问题所述,您的命名很混乱,请考虑惯例。一个一对一的关系是'device:Device'(单数),一对多关系是'devices:NSSet'(复数)。 – vadian

+0

我扭转了我的关系,并让Xcode重拍我的子类,所以现在看起来像这样:'@NSManaged public var devices:Device' – Martheli

+0

'devices'(复数)意味着**很多**设备。相应的类型是'NSSet'。否则(**一个**设备,单数)使用'device'(无尾随's')。 – vadian

回答

1

它看起来像你有你的关系的名称倒退。现在,DeviceMDM类型的关系被称为devices,而MDMDevice类型的关系被称为mdms。这意味着,如果与device.devices.os之间的值为os,这可能不是您想要的。

要解决它,你可能要扭转这些relationships--的名字在Device,更改名称从devicesmdms,并在MDM,将名称更改从mdmsdevices。一般来说,一段关系的名称应该描述它所关联的事物,而不是具有这种关系的事物。

+0

ok,然后一旦完成,我如何使用'device.devices.os'引用值。我是否设置为: 'let devices = NSEntityDescription.entity(forEntityName:“Device”,in:context)'然后使用'devices.mdms.os'? – Martheli

+0

您可以创建实例并提取您创建的实例。该行代码查找数据模型中的“Device”实体,但不创建任何实例。如果您不确定如何操作,请参阅Apple的[核心数据编程指南](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/CreatingObjects.html#//apple_ref/doc/uid/TP40001075-CH5-SW1) –

+0

而不是设置sqlite存储更容易,因为我比核心数据更习惯数据库SQL。 – Martheli