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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top