سؤال

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

أحتاج أساسا إلى أن أكون قادرا على استبعاد مجموعة من الكائنات، والطريقة الوحيدة التي أعتقد أنني أستطيع القيام بذلك هي أن تكون قادرا على الحصول على قائمة objectID من صفيف كائناتي المدارة، وإنشاء تعبير آخر في مسند لي للتأكد من أن أي كائنات عاد لا تملك نفس الشيء objectID. وبعد بمعنى آخر@"ANY records.objectID NOT IN %@", arrayOfObjectID.

كيف يمكنني أن أفعل هذا؟

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

المحلول

المسند مثل

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (self IN %@)", arrayOfExcludedObjects];

حيث يكون كيان طلب الجلب هو كيان الكائنات في الصفيف، يجب أن تفعل ما تريد. يمكن دمج هذا بالطبع مع البنود الأخرى في المسند الفردي لطلب جلب.

بشكل عام، مقارنات كائن (على سبيل المثال self == %@ أو self IN %@) objectID في استفسارات البيانات الأساسية. يمكن أن تكون الحجة إما مثيل NSManagedObject أو أ NSMangedObjectID نموذج. لذلك تنسيق المسند أعلاه قد يستغرق arrayOfExcludedObjects أو [arrayOfExcludedObjects valueForKey:@"objectID"] كما الحجة.

نصائح أخرى

في حين أن إجابة @ barrywark صحيحة عند العمل مع طلبات الجلب، أريد أن أكتب تحذيرا للناس الذين سيحاولون تطبيق هذه القاعدة على تصفية البيانات الأساسية إلى العديد من العلاقات.

قريبا: إذا عند التصفية إلى العلاقات إلى العديد من العلاقات التي تستخدمها، فإن مجموعة الكائنات الخاصة بك في الاستعلام هي صفيف من المعترضين - ثم يجب عليك استخدامها self.objectid. في سلسلة الاستعلام الخاصة بك مثل

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(self.objectID IN %@)", arrayOfObjectIDs];

لأنه باستخدام فقط (self IN %@) في حالة تصفية العلاقات إلى العديد من العلاقات ستؤدي إلى نتائج غير صحيحة - إنها مجرد NSArray التي تقيم المسندات ولا تعرف شيئا عن الأشياء الأساسية للبيانات NSManagedobjectid.

لقد وضعت قانون اختبار خاص يظهر هذا. آسف لكثير من الخطوط، لكنهم يستحقون ذلك. هناك كيانان: المستخدم والبريد والمستخدم لديه علاقة مع العديد منهم المسمى "المشاركات".

User *user = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([User class]) inManagedObjectContext:managedObjectContext()];

Post *post = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Post class]) inManagedObjectContext:managedObjectContext()];

[user addPostsObject:post];

[managedObjectContext() save:nil];

// 1. Both filtered relationship array and fetch result are correct!
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(self IN %@)", @[ post ]];

NSSet *filteredRelationship = [user.posts filteredSetUsingPredicate:predicate];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"];
NSArray *fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:nil];

NSLog(@"\n\n\nPredicate: %@", predicate);
NSLog(@"filteredRelationship: %@", filteredRelationship);
NSLog(@"fetchResult: %@", fetchResult);

// 2. Filtered relationship array is empty (wrong), fetch result is correct, !
predicate = [NSPredicate predicateWithFormat:@"(self IN %@)", @[ post.objectID ]];

filteredRelationship = [user.posts filteredSetUsingPredicate:predicate];

fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"];
fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:nil];

NSLog(@"\n\n\nPredicate: %@", predicate);
NSLog(@"filteredRelationship: %@", filteredRelationship);
NSLog(@"fetchResult: %@", fetchResult);

// 3. Filtered relationship array is empty (wrong), fetch result is correct
predicate = [NSPredicate predicateWithFormat:@"(self.objectID IN %@)", @[ post ]];

filteredRelationship = [user.posts filteredSetUsingPredicate:predicate];

fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"];
fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:nil];

NSLog(@"\n\n\nPredicate: %@", predicate);
NSLog(@"filteredRelationship: %@", filteredRelationship);
NSLog(@"fetchResult: %@", fetchResult);

// 4. Filtered relationship array is correct, fetch result is correct
predicate = [NSPredicate predicateWithFormat:@"(self.objectID IN %@)", @[ post.objectID ]];

filteredRelationship = [user.posts filteredSetUsingPredicate:predicate];

fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"];
fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:nil];

NSLog(@"\n\n\nPredicate: %@", predicate);
NSLog(@"filteredRelationship: %@", filteredRelationship);
NSLog(@"fetchResult: %@", fetchResult);

TLDR الناتج

<redacted> Predicate: SELF IN {<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: { content = nil; title = nil; user = "0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>"; })}

<redacted> filteredRelationship: {(<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: { content = nil; title = nil; user = "0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>"; }) )}

<redacted> fetchResult: ("<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: {\n    content = nil;\n    title = nil;\n    user = \"0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>\";\n})")

<redacted> Predicate: SELF IN {0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1>}

<redacted> filteredRelationship: {()}

<redacted> fetchResult: ("<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: {\n    content = nil;\n    title = nil;\n    user = \"0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>\";\n})")

<redacted> Predicate: objectID IN {<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: { content = nil; title = nil; user = "0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>";})}

<redacted> filteredRelationship: {()}

<redacted> fetchResult: ("<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: {\n    content = nil;\n    title = nil;\n    user = \"0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>\";\n})")

<redacted> Predicate: objectID IN {0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1>} 

<redacted> filteredRelationship: {(<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: { content = nil; title = nil; user = "0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>";}))}

<redacted> fetchResult: ("<Post: 0x2a04f10> (entity: Post; id: 0x2a56c40 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/Post/p1> ; data: {\n    content = nil;\n    title = nil;\n    user = \"0x2af2a20 <x-coredata://9D07BF41-2DC0-42C1-9DD8-6082A00E7BEB/User/p1>\";\n})")

SWIFT 3 الحل

واجهت نفس الموقف لذلك أنا نشر حل 3 سويفت أدناه

let predicate = NSPredicate(format:"NOT (self IN %@)",[arrayofNSManagedObjects])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top