2017-06-14 121 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