البيانات الأساسية، و Nspremedicate والعديد من المفتاح

StackOverflow https://stackoverflow.com/questions/1164338

  •  18-09-2019
  •  | 
  •  

سؤال

لدي نموذج بيانات أساسي حيث يتضمن كيان المهام علاقة اختيارية إلى العديد من العلاقات. تتمثل إحدى خصائص Excludedoccurres، وهو كائن NSDate. يتمتع كيان Excludedoceducurrence بإلزامي عكس علاقة مع كيان المهام.

من أجل جلب المهام لمدة يوم محدد، أحتاج إلى التأكد من أن اليوم المحدد لا يظهر كخاصية بدء أي كيان مسكني. أحد المسندات الفرعية أحاول استخدامه هو لذلك

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];

حيث اليوم هو كائن NSDate لهذا اليوم بما في ذلك مكونات اليوم والشهر والسنة. تضم جميع خصائص Startces Students المستبعدة أيضا مكونات اليوم والشهر والسنة.

في حين أن هذا يجب أن يكون جيدا، على الأقل قراءة الوثائق للبيانات الأساسية و NSPreedicate، أحصل على رسالة الخطأ التالية:

إنهاء التطبيقات بسبب استثناء غير قديم "NSinvalidargumentException"، السبب: 'المسند غير مدعوم

إذا كنت تستخدم المسند المكافئ

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];

لا يتم إلقاء أي استثناء، ومع ذلك لا يعمل الكود كما هو متوقع: يتم استبعاد حدوث اليوم، والتي لا ينبغي استبعادها، بدلا من ذلك.

لست متأكدا من كيفية اختبار الحالة باستثناء الحالة == NIL: المسند التالي

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];

أسباب في وقت التشغيل الاستثناء

إلى - العديد من المفتاح غير مسموح به هنا

ومع ذلك، نظرا لأن العلاقة غير المستكدة اختيارية، فأنا بحاجة أيضا إلى اختبار ما إذا كان لا شيء.

كيف يمكنني التعامل مع هذا؟ شكرا لكم مقدما.

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

المحلول 2

بمساعدة كل شيء، تمكنت أخيرا من تحديد المسند الصحيح لسيناريو. يبدو أن كائن NSDate يتم التعامل معه باعتباره مزدوجا، ومع ذلك، فإن المزدوج لا شيء مثل 3.7، فهو دائما مثل 3.0 لذلك، فإن المسند التالي يعمل بشكل صحيح في اختباراتي:

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];

حيث هذا هو كائن NSDate الذي يحتوي على مكونات اليوم والشهر والسنة (كما هو الحال في خاصية البداية للكيان المعاكس.

يتم إجراء اختبار لعلاقة فارغة بشكل أساسي باستخدام المشغل الإجماليCount، كما اقترح بعض الناس في Apple.

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

نصائح أخرى

لاختبار علاقة فارغة، يجب أن تقارن عدد المفتاح إلى كثير إلى الصفر.

[NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];

بالنسبة إلى العمليات الفرعية الخاصة بك، كن على علم بأنه لا يمكنك إلا أن يكون لديك واحد من أي ALL أو ANY المعدلات في المسند النهائي الخاص بك، على الرغم من أنه يمكنك استخدام هذا المعدل عدة مرات في جميع أنحاء المسند.

ليس جيدا: ANY foo.bar = 1 AND ALL foo.baz = 2
نعم: ANY foo.bar = 1 AND !(ANY foo.baz != 2)

لذلك، لاختبار علاقة غير فارغة، وهذا يعمل بالفعل:

[NSPredicate predicateWithFormat:@"relationship.@count != 0"]

الحل الذي قدمه آشلي كلارك تعطل بالنسبة لي إعطاء "مفتاح كثيرة غير مسموح به هنا"

وفي سويفت 2، شيء مثل:

request.predicate = NSPredicate(format: " relationship.@count != 0")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top