Question

J'ai rencontré un problème lorsque j'ai transféré mon code d'une base de données SQLite vers Core Data.

Les données que j'utilise proviennent d'une base de données existante et contiennent toutes les relations définies à l'aide de l'ID de chacune des tables (ou des entités maintenant que j'utilise Core Data). Mon problème est que je veux interroger une seule table, puis utiliser ce résultat pour propager les données vers le haut pour obtenir toutes les autres données dont j'ai besoin.

La base de données d'origine ressemble à:

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);

Ma requête SQL d'origine est:

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 = '%@';

Existe-t-il un moyen de répliquer cette requête à l'aide de NSPredicate (ou quelque chose de similaire) ou dois-je d'abord effectuer la recherche

TecAccessPoints.MAC == '%@'

Ensuite, effectuez une autre recherche sur les données en utilisant les données renvoyées telles que:

Zones.ID == TecAccessPoints.ZoneID

Et ainsi de suite jusqu'à ce que tous mes résultats me soient utiles?

Merci

James

Était-ce utile?

La solution

Vous ne pouvez pas répliquer votre requête en tant que prédicat Core Data, car vous ne pouvez extraire qu'une seule entité à la fois. Cependant, cela peut être un cas où penser à des choses comme un graphe d'objet plutôt que des tables de base de données pourrait être beaucoup plus fructueux. Si vous avez des relations

TecAccessPoints <*-> Zones <*-> Buildings <-> etc.
                           <-*> Rooms

Vous pouvez facilement interroger TecAccessPoints en suivant les indications ci-dessus, puis suivre les relations définies dans le code, par exemple.

TecAccessPoint *tap;
// fetch tap

Campus *campus = tap.zone.building.campus;
NSSet *rooms = tap.zone.rooms;

en supposant que les relations s'appellent zone , bâtiment , chambres , etc. et que vous ayez les catégories NSManagedObject appropriées définir le @properties associé afin que le compilateur ne se plaint pas.

Bien entendu, Core Data exécute une séquence de requêtes SQL qui sont toutes des JOIN de multiples tables. Core Data réussit assez bien à faire baisser les performances de ce minimum, mais si vous êtes un geek de la base de données, cela peut vous déranger. Si c'est le cas, vous devrez vous en tenir au SQLite brut. Passer à Core Data implique que vous souhaitiez penser à des choses au niveau du graphe d'objet et ignorer les détails de la mise en œuvre pour la plupart.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top