سؤال

لدي موقف حيث أرغب في جلب كائنات من مخزن البيانات الأساسية الخاصة بي بواسطة مفتاح اسم المستخدم، لكنني أريد أن تكون المقارنة غير حساسة للحالة. المسند لدي هذا:

username IN $usernames

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

username IN[c] $usernames

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

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

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

المحلول

يبدو أن معدل الحالة الموجود في المشغل في المشغل عند تنفيذ جلب ضد متجر SQLite. (قمت بحذف نوع المتجر من سؤالك.)

أود أن أوصي بإيداع خطأ ضد الوثائق بحيث يمكن توثيق هذا القيد / السلوك.

أود أيضا تقديم طلب ميزة في مراسل الأخطاء بحيث يمكن النظر في هذا للحصول على الدعم المستقبلي.

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

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

نصائح أخرى

قد تجرب شيئا مثل ANY $usernames LIKE[c] username. وبعد لقد فعلت شيئا مشابها، حيث بدلا من التقليد المتغير، لدي مسار رئيسي مثل "الأشخاص"، وأن المسند يعمل بالنسبة لي. لست متأكدا مما إذا كان يعمل بشكل مختلف مع متغير هناك بدلا من مسار رئيسي، لكن الأمر يستحق رصاصة.

هنا حل آخر، ولكن يتطلب منك تغيير الأم.

جعل اسم المستخدم كيان مجهز كامل. قم بإنشاء العلاقة العكسية بين اسم المستخدم وأي شيء كيانك الآخر هو.

الآن بالنسبة لطلب الجلب، قم بتعيين الكيان ك "اسم المستخدم" ثم قم بتشغيل هذا المسند (على افتراض خاصية "اسم" و "الأصل" الخاصية):

   [NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject]

قد يكون هذا مبالغا فيه، لكنه سيسمح لك بتشغيل بحثك حسب الرغبة.

على الرغم من أن هذا السؤال هو عدة سنوات تعثرت فقط على نفس المشكلة وحلها مثل هذا:

NSArray  *values = @[@"FOO", @"bar" ,@"lorem"];
NSString *predicate;

predicate = @"value LIKE[cd] '";
predicate = [predicate stringByAppendingString:
             [values componentsJoinedByString:
              @"' OR  value LIKE[cd] '"]];
predicate = [predicate stringByAppendingString:@"'"];

NSLog(@"%@",  predicate);
// Output:
// value LIKE[cd] 'FOO' OR  value LIKE[cd] 'bar' OR  value LIKE[cd] 'lorem'

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

تحديث 2:

في الواقع يبدو أن الحل المحدث أدناه لا يعمل مع SQLite وينتج

'NSInvalidArgumentException',
reason: 'unimplemented SQL generation for predicate : ... (bad LHS)'

أعتقد أن المصفاة / DICT / SET مقارنات و IN لا يوجد سوى مفاتيح مسموح بها على الجانب الأيسر من المشغل.

تحديث:

بعد بعض الأبحاث حول التعبيرات والمساغب في العثور على مثال آخر، يبدو أنه يعمل بشكل جيد للغاية:

NSPredicate *predicate =
   [NSPredicate predicateWithFormat:
     @"lowercase(value) IN %@", values];

هذا يستخدم تعبير الوظيفة lowercase: للحصول على تمثيل صغير للقيمة. كل ما تبقى للقيام به هو ضمان أن جميع مداخل values هي صغيرة وستتمكن من استخدام حالة حساسة IN التعبيرات.

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