البيانات الأساسية: كيفية التحقق من وجود العديد من العديد من العلاقة

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

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي "أغنية" الكيان و "علامة" كيان ولديهم الكثير لكثير من العلاقة بينهما. أغنية يمكن أن يكون الكلمات متعددة والعلامات يمكن تطبيقها على عدة أغاني.

وأريد للتحقق مما إذا أغنية لديها بطاقة خاصة المرتبطة به. إذا كان لدى كلمات علامة associted مع ذلك، أريد أن تظهر علامة في عرض جدول.

لمنطق مماثل، في آبل "TaggedLocations" نموذج التعليمات البرمجية، يتم إجراء الاختيار التالية للتحقق من وجود هذه العلاقة.

if ([event.tags containsObject:tag]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}   

وهذا قد يكون غير فعال إذا كان هناك الكثير من الكلمات في قاعدة البيانات حيث سيؤدي ذلك إلى جلب كل منهم في الذاكرة. يرجى تصحيح لي إذا كنت مخطئا هنا.

هل هناك طريقة أكثر كفاءة لمعرفة ما اذا كان يرتبط أغنية مع بطاقة معينة بدلا من التدقيق في Song.Tags؟

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

المحلول

وانها في الواقع من السهل جدا القيام به، إذا لا يحملون وثائق تماما. كنت ترغب في إنشاء جلب الطلب مع المسند له العملية مجموعة. إذا كان لنا أن نتصور أن نموذج بطاقة لديه خاصية تسمى tagValue، المسند يهمك هو "أي tags.tagValue == 'footag"

NSString *tagSearch = @"footag";

// However you get your NSManagedObjectContext.  If you use template code, it's from
// the UIApplicationDelegate
NSManagedObjectContext *context = [delegate managedObjectContext];

// Is there no shortcut for this?  Maybe not, seems to be per context...
NSEntityDescription *songEntity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:songEntity];

// The request looks for this a group with the supplied name
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagValue == %@", tagSearch];
[request setPredicate:predicate];

NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];

[request release];

نصائح أخرى

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

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Tag" inManagedObjectContext:[self managedObjectContext]]]; 
[fetchRequest setResultType:NSManagedObjectIDResultType];
ويضمن الأجسام

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

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