سؤال

ولقد واجهت مشكلة عند لقد تم ترقية قانون بلدي على من قاعدة بيانات SQLite إلى البيانات الأساسية.

والبيانات التي أنا باستخدام يأتي من قاعدة البيانات الموجودة وعلى هذا النحو لديه كل العلاقات المعرفة باستخدام معرف من كل من الجداول (أو الكيانات أنا الآن أن تستخدم البيانات الأساسية). مشكلتي هي أنني أريد أن الاستعلام مقابل جدول واحد ثم استخدام ذلك نتيجة لنشر ما يصل على الرغم من أن البيانات للحصول على كل البيانات الأخرى التي أنا بحاجة إليها.

وقاعدة البيانات الأصلية تبدو مثل:

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

وهكذا دواليك إلى أن لدي كل ما عندي من النتائج التي أحتاجها؟

والشكر

وجيمس

هل كانت مفيدة؟

المحلول

وأنت لا يمكن نسخ الاستعلام ك المسند البيانات الأساسية لأنك يمكن أن تجلب كيان واحد فقط في المرة الواحدة. ومع ذلك، قد يكون هذا الحالة التي يكون فيها التفكير في أشياء مثل الرسم البياني الكائن بدلا من جداول قاعدة البيانات قد تكون أكثر فائدة بكثير. إذا كان لديك علاقات

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 المرتبطة بحيث لا يشكو المترجم.

وبطبيعة الحال، تحت البيانات الأساسية تقوم بعمل سلسلة من الاستفسارات SQL التي هي كل واحدة منها التسجيل عبر جداول متعددة. البيانات الأساسية هي جيدة جدا حول جعل ضرب أداء هذا الحد الأدنى، ولكن إذا كنت المهوس DB، وهذا قد يزعجك. إذا كان الأمر كذلك، سيكون لديك لعصا مع سكليتي الخام. الانتقال إلى البيانات الأساسية يعني كنت على استعداد للتفكير في الأمور على مستوى الكائن الرسم البياني وتجاهل تفاصيل التنفيذ بالنسبة للجزء الأكبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top