Mithilfe von NSPREDIATE die Suche nach mehreren Entitäten durchführen
-
06-07-2019 - |
Frage
Ich bin auf ein Problem gestoßen, als ich meinen Code aus einer SQLite -Datenbank auf Kerndaten portiert habe.
Die Daten, die ich verwende, stammen aus einer vorhandenen Datenbank, und als solche sind alle Beziehungen mit der ID der einzelnen Tabellen definiert (oder Entitäten, die jetzt Kerndaten verwende). Mein Problem ist, dass ich an einer einzigen Tabelle abfragen möchte und dieses Ergebnis verwenden möchte, um die Daten zu verbreiten, um alle anderen Daten zu erhalten, die ich benötige.
Die ursprüngliche Datenbank sieht aus wie:
CREATE TABLE TecAccessPoints (MAC varchar NOT NULL PRIMARY KEY UNIQUE,ZoneID integer NOT NULL,Floor integer);
CREATE TABLE Zones (ID integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,ZoneName varchar NOT NULL,BuildingID integer,ZoneDescription varchar);
CREATE TABLE Buildings (ID integer NOT NULL PRIMARY KEY AUTOINCREMENT,BuildingName varchar NOT NULL,CampusID integer NOT NULL,BuildingDescription varchar,Long float,Lat float);
CREATE TABLE Campuses (ID integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,CampusName varchar NOT NULL,CampusDescription text, Latitude float, Longitude float);
Meine ursprüngliche SQL -Abfrage lautet:
SELECT DISTINCT Zones.ID, Zones.ZoneName, Buildings.ID, Buildings.BuildingName, Campuses.ID, Campuses.CampusName, Rooms.ID, Rooms.NameNumber, Rooms.Floor
FROM Zones, TecAccessPoints, Buildings, Campuses, Rooms
WHERE Campuses.ID = Buildings.CampusID
AND Buildings.ID = Zones.BuildingID
AND Zones.ID = Rooms.ZoneID
AND Zones.ID = TecAccessPoints.ZoneID
AND TecAccessPoints.MAC = '%@';
Gibt es eine Möglichkeit, diese Abfrage mit nSpredicate (oder ähnlichem) zu replizieren, oder ist es der Fall, dass ich zuerst die Suche durchführen muss
TecAccessPoints.MAC == '%@'
Führen Sie dann eine weitere Suche auf die Daten mit den zurückgegebenen Daten wie folgt durch:
Zones.ID == TecAccessPoints.ZoneID
Und so weiter, bis ich alle meine Ergebnisse habe, die ich brauche?
Vielen Dank
James
Lösung
Sie können Ihre Abfrage nicht als Kerndatenprädikat replizieren, da Sie jeweils nur eine Entität holen können. Dies kann jedoch ein Fall sein, in dem das Denken über Dinge als Objektgrafik und nicht die Datenbanktabellen viel fruchtbarer sein könnte. Wenn Sie Beziehungen haben
TecAccessPoints <*-> Zones <*-> Buildings <-> etc.
<-*> Rooms
Sie können leicht Tecaccesspoints abfragen, wie Sie oben angezeigt werden, und folgen Sie den Beziehungen im Code, z. B.
TecAccessPoint *tap;
// fetch tap
Campus *campus = tap.zone.building.campus;
NSSet *rooms = tap.zone.rooms;
Angenommen, die Beziehungen werden benannt zone
, building
, rooms
, usw. und Sie haben angemessen NSManagedObject
Kategorien, um die zugehörigen zu definieren @properties
so dass sich der Compiler nicht beschwert.
Natürlich werden unter den Kerndaten eine Abfolge von SQL -Abfragen durchgeführt, die jeweils ein Verbindungsbereich über mehrere Tabellen sind. Kerndaten sind ziemlich gut, wenn Sie die Leistung dieses minimalen Treffers machen, aber wenn Sie ein DB -Geek sind, kann dies Sie stören. Wenn ja, müssen Sie sich an das rohe SQLite halten. Wenn Sie sich auf Kerndaten bewegen, sind Sie bereit, über Dinge auf der Objektgrafikebene nachzudenken und die Implementierungsdetails größtenteils zu ignorieren.