Pergunta

Eu encontrei um problema quando estou portando meu código de um banco de dados SQLite para dados principais.

Os dados que estou usando são provenientes de um banco de dados existente e, como tal, todos os relacionamentos são definidos usando o ID de cada uma das tabelas (ou entidades agora que estou usando dados principais). Meu problema é que eu quero consultar uma única tabela e depois usar esse resultado para se propagar através dos dados para obter todos os outros dados necessários.

O banco de dados original se parece:

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

Minha consulta SQL original é:

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 alguma maneira de replicar esta consulta usando nspredicate (ou algo semelhante) ou é o caso que terei que realizar a pesquisa primeiro

TecAccessPoints.MAC == '%@'

Em seguida, faça outra pesquisa nos dados usando os dados retornados como:

Zones.ID == TecAccessPoints.ZoneID

E assim por diante até que eu tenha todos os meus resultados que preciso?

Obrigado

James

Foi útil?

Solução

Você não pode replicar sua consulta como um predicado de dados principal, porque pode buscar apenas uma entidade por vez. No entanto, esse pode ser um caso em que pensar sobre as coisas como gráfico de objeto, em vez das tabelas de banco de dados, pode ser muito mais frutífero. Se você tem relacionamentos

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

Você pode consultar facilmente o TecaccessPoints, como mostra acima e depois seguir os relacionamentos no código, por exemplo

TecAccessPoint *tap;
// fetch tap

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

assumindo que os relacionamentos são nomeados zone, building, rooms, etc. e você tem apropriado NSManagedObject categorias para definir o associado @properties para que o compilador não reclame.

Obviamente, abaixo dos dados do núcleo está fazendo uma sequência de consultas SQL, cada uma de uma junção em várias tabelas. Os dados principais são muito bons em tornar o desempenho do desempenho desse mínimo, mas se você é um geek de banco de dados, isso pode incomodá -lo. Nesse caso, você terá que ficar com o sqlite bruto. Mudar para os dados principais implica que você está disposto a pensar nas coisas no nível do gráfico do objeto e ignorar os detalhes da implementação na maior parte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top