質問

SQLiteデータベースからCore Dataにコードを移植しているときに問題が発生しました。

使用しているデータは既存のデータベースからのものであり、各テーブル(または現在コアデータを使用しているエンティティ)のIDを使用して定義されたすべての関係があります。私の問題は、単一のテーブルに対してクエリを実行し、その結果を使用してデータを伝播し、必要な他のすべてのデータを取得することです。

元のデータベースは次のようになります。

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

必要な結果がすべて揃うまで続きますか?

ありがとう

ジェームズ

役に立ちましたか?

解決

一度に取得できるエンティティは1つだけであるため、クエリを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 を定義します。

もちろん、コアデータの下では、それぞれが複数のテーブルにわたるJOINである一連のSQLクエリを実行しています。 Core Dataは、この最小のパフォーマンスヒットを作成することについては非常に優れていますが、DBのオタクである場合、これは気になるかもしれません。もしそうなら、あなたは生のSQLiteに固執する必要があります。コアデータに移行するということは、オブジェクトグラフレベルで物事について考え、ほとんどの部分で実装の詳細を無視する意思があることを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top