Domanda

Ho riscontrato un problema quando ho trasferito il mio codice da un database SQLite a Core Data.

I dati che sto usando provengono da un database esistente e come tali hanno tutte le relazioni definite usando l'ID di ciascuna delle tabelle (o entità ora che sto usando i dati di base). Il mio problema è che desidero eseguire una query su una singola tabella, quindi utilizzare quel risultato per propagare i dati per ottenere tutti gli altri dati richiesti.

Il database originale è simile a:

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

La mia query SQL originale è:

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

Esiste un modo per replicare questa query usando NSPredicate (o qualcosa di simile) o è il caso che dovrò prima eseguire la ricerca

TecAccessPoints.MAC == '%@'

Quindi esegui un'altra ricerca sui dati utilizzando i dati restituiti come:

Zones.ID == TecAccessPoints.ZoneID

E così via finché non avrò tutti i miei risultati di cui ho bisogno?

Grazie

James

È stato utile?

Soluzione

Non è possibile replicare la query come predicato di dati principali perché è possibile recuperare solo un'entità alla volta. Tuttavia, questo potrebbe essere un caso in cui pensare alle cose come il grafico degli oggetti piuttosto che le tabelle del database potrebbe essere molto più fruttuoso. Se hai relazioni

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

Puoi facilmente interrogare TecAccessPoints come mostrato sopra, quindi seguire le relazioni nel codice, ad es.

TecAccessPoint *tap;
// fetch tap

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

presupponendo che le relazioni siano denominate zone , building , rooms , ecc. e che tu abbia le categorie NSManagedObject appropriate per definire il @properties associato in modo che il compilatore non si lamenta.

Ovviamente, sotto Core Data sta eseguendo una sequenza di query SQL, ciascuna delle quali è JOIN su più tabelle. Core Data è abbastanza bravo a rendere le prestazioni di questo minimo, ma se sei un fanatico del DB, questo potrebbe disturbarti. In tal caso, dovrai rimanere con il SQLite grezzo. Il passaggio a Core Data implica che sei disposto a pensare a cose a livello del grafico degli oggetti e a ignorare i dettagli dell'implementazione per la maggior parte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top