iOS - NSPredicate string.length ประเมินเป็น 0 เสมอเมื่อสตริงเริ่มต้นด้วยตัวดำเนินการทางคณิตศาสตร์ + - * /

ฉันมีวิธีง่าย ๆ ที่ใช้ NSPredicate เพื่อส่งคืนจำนวนแถวโดยที่ comment.length > 0

ปัญหาคือ ฉันพบว่าเมื่อคอลัมน์ Comment ขึ้นต้นด้วย + - * หรือ / คุณสมบัติ length จะประเมินเป็น 0 เสมอ ดังนั้นแถวจึงถูกแยกออกจากการนับ

ฉันเปิดตารางในเบราว์เซอร์ SQLite และตรวจสอบว่าคอลัมน์นั้นเป็น VARCHAR การใช้แบบสอบถาม SQLite เพื่อตรวจสอบความยาวของสตริงทำงานได้ดี (LENGTH(ZComments) > 0) ดังนั้นนี่จะต้องเป็นปัญหาของ CoreData

นี่คือหน้าที่ของฉัน...

-(int)getCommentsCount{
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setIncludesSubentities:YES];
    [request setEntity:[NSEntityDescription entityForName:@"InspectionRecord" inManagedObjectContext:managedObjectContext]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(comments.length > 0)"];
    [request setPredicate:predicate];

    NSError *err;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&err];

    //count is ALWAYS 0 if 'comments' starts with + - * or /     WHYYY???      
    return count;
}

ฉันสามารถแก้ไขปัญหานี้ได้โดยการตรวจสอบสตริงว่าง/null แทนที่จะใช้ .length แต่ฉันอยากรู้ว่าทำไม .length จึงล้มเหลวเมื่อสตริงขึ้นต้นด้วยอักขระบางตัว

สิ่งนี้เคยเกิดขึ้นกับใครบ้างไหม?


person iupchris10    schedule 31.03.2014    source แหล่งที่มา
comment
ไม่ใช่สาเหตุของข้อผิดพลาด แต่ลายเซ็นวิธีการควรเป็น -(NSUInteger)commentsCount จับคู่ประเภทการส่งคืนของ -countForFetchRequest:error: และอย่าขึ้นต้นชื่อเมธอดด้วย get เว้นแต่จะส่งคืนหลายรายการทางอ้อม (แบบแผนการตั้งชื่อ Cocoa)   -  person Hal Mueller    schedule 31.03.2014


คำตอบ (1)


คุณไม่สามารถใช้ฟังก์ชัน Objective-C เช่น length ในคำขอดึงข้อมูล Core Data ได้ (และส่วน ".length" จะถูกละเว้นเมื่อ Core Data แปลคำขอดึงข้อมูลเป็นแบบสอบถาม SQLite) แต่คุณสามารถเปรียบเทียบกับสตริงว่างแทนได้:

 [NSPredicate predicateWithFormat:@"comment != ''"]

สำหรับข้อความค้นหาอื่นๆ ที่เกี่ยวข้องกับความยาว คุณสามารถใช้ตัวดำเนินการ MATCHES กับนิพจน์ทั่วไปดังที่แสดงไว้ที่นี่: CoreData ภาคแสดง: ความยาวคุณสมบัติสตริง?

person Martin R    schedule 31.03.2014
comment
นอกจากนี้ เหตุผลที่การใช้ .length อาจดูเหมือนใช้งานได้ในบางครั้งก็คือ Core Data จะแปล comments.length > 0 เป็น SQL ในลักษณะประมาณ t0.ZCOMMENTS > 0 ทำให้ส่วนที่มีความยาวของการสืบค้นหายไป นั่น ดูเหมือนเป็นข้อบกพร่องสำหรับฉัน แต่นั่นเป็นสิ่งที่เกิดขึ้นในขณะนี้ ฉันไม่รู้ว่า SQLite ประเมินสตริงในการเปรียบเทียบ > 0 อย่างไร แต่ไม่ใช่สิ่งที่ comments.length บอกเป็นนัย - person Tom Harrington; 31.03.2014
comment
คำอธิบายที่ดี ขอบคุณ! ฉันยังตรวจสอบสิ่งนี้ด้วยการเปลี่ยน .length เป็น .foo และได้ผลลัพธ์เดียวกัน มีวิธีที่ถูกต้องในการเปรียบเทียบความยาวของสตริงโดยใช้ NSPredicate หรือไม่? นอกจากนี้.... ควรมีคนบอกคนในกระทู้นี้ดีกว่าว่าพวกเขากำลังทำสิ่งผิด.... stackoverflow.com/questions/7369390/ - person iupchris10; 31.03.2014
comment
@ iupchris10: comment.length › 0 และ ทำงาน ที่คล้ายกันเมื่อเช่น อาร์เรย์การกรอง มันล้มเหลวเฉพาะสำหรับคำขอดึงข้อมูลหลักเท่านั้น (และที่ได้กล่าวไว้แล้วในความคิดเห็นเดียวต่อคำตอบ) - person Martin R; 31.03.2014
comment
@ iupchris10: การเปรียบเทียบความยาวสตริงอื่น ๆ สามารถทำได้ด้วยนิพจน์ทั่วไป (เช่นเดียวกับคำตอบที่ฉันเชื่อมโยง) - person Martin R; 31.03.2014
comment
@MartinR - ขอบคุณ ฉันเพิ่งสะดุดกับกระทู้นี้ ซึ่งแนะนำให้เพิ่มคุณสมบัติความยาวให้กับอ็อบเจ็กต์ที่คุณจัดการ และตั้งค่าทุกครั้งที่ค่าข้อความมีการเปลี่ยนแปลง - [ลิงก์]stackoverflow.com /คำถาม/3644621/ - person iupchris10; 31.03.2014