2

当我将代码从 SQLite 数据库移植到 Core Data 时遇到了问题。

我使用的数据来自现有数据库,因此所有关系都使用每个表的 ID(或现在我使用 Core Data 的实体)定义。我的问题是我想查询单个表,然后使用该结果向上传播数据以获取我需要的所有其他数据。

原始数据库如下所示:

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

我原来的 SQL 查询是:

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

有什么方法可以使用 NSPredicate (或类似的东西)复制这个查询,还是我必须首先执行查找

TecAccessPoints.MAC == '%@'

然后使用返回的数据对数据进行另一次查找,例如:

Zones.ID == TecAccessPoints.ZoneID

依此类推,直到我得到我需要的所有结果?

谢谢

詹姆士

4

1 回答 1

2

您不能将查询复制为 Core Data 谓词,因为您一次只能获取一个实体。但是,在这种情况下,将事物视为对象图而不是数据库表可能会更有成效。如果你有关系

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

如上所示,您可以轻松查询 TecAccessPoints,然后遵循代码中的关系,例如

TecAccessPoint *tap;
// fetch tap

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

假设关系被命名为zone, building,rooms等,并且您有适当NSManagedObject的类别来定义关联@properties,这样编译器就不会抱怨。

当然,在 Core Data 之下是执行一系列 SQL 查询,每个查询都是跨多个表的 JOIN。Core Data 非常擅长将这种性能影响降至最低,但如果您是 DB 极客,这可能会打扰您。如果是这样,您将不得不坚持使用原始 SQLite。迁移到 Core Data 意味着您愿意在对象图级别考虑事物并忽略大部分实现细节。

于 2009-07-31T16:01:52.810 回答