2017-06-14 3 views
0

Ich habe zwei Einheiten, Device und MDM. Gerät hat zwei Attribute, Asset-Tag und Standort. MDM hat zwei Attribute, Asset-Tag und Betriebssystem. Ich versuche, asset_tag, os und location für jedes asset_tag-Gerät abzurufen. Ich hatte Xcode erstellen meine Subklassen:Core Data Swift 3 Beziehung

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? 

} 

Meine Abrufanforderung ist wie folgt:

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

Nicht sicher, wie so etwas wie device.mdms.os bekommen zu arbeiten, um das Betriebssystem von einem bestimmten Gerät zu bekommen.

+0

Wie in der anderen Frage erwähnt, ist Ihre Benennung verwirrend, bitte beachten Sie die Konvention. Eine Eins-zu-Eins-Beziehung ist "Gerät: Gerät" (Singular), eine Eins-zu-Viele-Beziehung ist "Geräte: NSSet" (Mehrzahl). – vadian

+0

Ich kehrte meine Beziehungen um und ließ Xcode meine Unterklassen neu erstellen. Jetzt sieht es so aus: '@NSManaged public var devices: Device' – Martheli

+0

Wiederum bedeutet' devices' (Plural) ** viele ** Geräte. Der entsprechende Typ ist 'NSSet'. Ansonsten (** ein ** Gerät, Singular) benutze 'Gerät' (ohne 's'). – vadian

Antwort

1

Es scheint, als ob Sie die Namen Ihrer Beziehungen rückwärts haben. Im Moment hat Device eine Beziehung namens devices vom Typ MDM, und MDM hat eine Beziehung namens mdms vom Typ Device. Das bedeutet, dass Sie den Wert os für einen Device mit device.devices.os erhalten, was wahrscheinlich nicht so ist, wie Sie es tun möchten.

Um es zu beheben Sie wahrscheinlich die Namen jener relationships-- in Device umkehren wollen, ändern Sie den Namen devices-mdms und in MDM, mdms-devices den Namen ändern. Im Allgemeinen sollte der Name einer Beziehung die Sache beschreiben, auf die sie sich bezieht, nicht die Sache, die die Beziehung hat.

+0

ok und dann, wenn das erledigt ist, wie referenziere ich die Werte mit' device.devices.os'. Richte ich es wie folgt ein: 'lets devices = NSEntityDescription.entity (forEntityName:" Device ", in: Kontext)' und dann 'devices.mdms.os'? – Martheli

+0

Sie können Instanzen erstellen und Instanzen abrufen, die Sie erstellt haben. Diese Codezeile sucht in Ihrem Datenmodell nach der Einheit "Device", erstellt jedoch keine Instanzen. Wenn Sie sich nicht sicher sind, wie das geht, finden Sie in Apples [Core Data Programming Guide] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/CreatingObjects.html#//apple_ref/doc/uid/TP40001075-CH5-SW1) –

+0

Wäre es einfacher, stattdessen einen SQLite-Speicher einzurichten, da ich mehr an Datenbank-SQL gewöhnt bin als an Kerndaten. – Martheli