ดำเนินการคำนวณด้วยเขตข้อมูลของฐานข้อมูลใน NSPredicate Core Data

ฉันสร้างวิธีการกู้คืนผลิตภัณฑ์จากฐานข้อมูลของฉัน แต่ละรายการมีฟิลด์ความสูง ความกว้าง และ percErro (ข้อผิดพลาดเปอร์เซ็นต์)

ผู้ใช้กรอกความกว้างและความสูงที่คุณต้องการค้นหา เช่น 15 x 15ซม

จากนั้นวิธีการควรนำผลิตภัณฑ์ที่เข้ากันได้มาด้วยตัวเลขเหล่านี้ โดยคำนึงถึงเปอร์เซ็นต์ของข้อผิดพลาดที่อนุญาตในการลงทะเบียน

สมมติว่าผลิตภัณฑ์มีฐานข้อมูลขนาด 14 x 14 ซม. และเปอร์เซ็นต์ข้อผิดพลาดคือ 10% (1.4 ซม.) จากนั้นคุณค้นหาผลิตภัณฑ์ที่มีขนาด 15 x 15 ซม.

ในคำถามของฉันฉันต้องทำอะไรแบบนี้:

[query appendString: [NSString stringWithFormat: @ "(heigthInserted * percErro / 1000) <= (height * percErro / 100)"

[query appendString: [NSString stringWithFormat: @ "AND (widthInserted * percErro / 1000) <= (width * percErro / 100)"

 NSPredicate * predicate = [NSPredicate predicateWithFormat: query];
    [Request setPredicate: predicate];

นี่ควรนำผลิตภัณฑ์ทั้งหมดมาให้ฉันโดยมีเปอร์เซ็นต์ข้อผิดพลาดไม่เกิน 10% (1.4 ซม.)

ฉันรู้ว่า NSPredicate ไม่ยอมรับการดำเนินการทางคณิตศาสตร์ ฉันจะรับผลลัพธ์จากการคำนวณเปอร์เซ็นต์ของข้อผิดพลาดนี้ได้อย่างไร

**

แก้ไขแล้ว

**

ฉันยอมรับคำตอบของ pbasdf และสรุปว่าตัวดำเนินการทางคณิตศาสตร์ทำงานใน NSPredicate แต่ต้องเขียนตามเอกสารประกอบของลิงก์นี้: เอกสารประกอบ

ต่ำกว่าวิธีการทำงาน 100% ของฉันกับโอเปอเรเตอร์:

-(NSMutableArray*)findWithDimensoes:(NSMutableArray*)formatos :(float)largura :(float)altura{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:TABLE_NAME inManagedObjectContext:managedObjectContext]];

    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"altura" ascending:YES];
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"largura" ascending:YES];

    NSArray *arraySD = [NSArray arrayWithObjects:sortDescriptor1,sortDescriptor2,nil];
    [request setSortDescriptors:arraySD];
    [request setFetchLimit:20];

    NSMutableString *query = [[NSMutableString alloc] init];

    [query appendString:[NSString stringWithFormat:@" (habilitado == true) "]];

    if (formatos != nil) {
        for (ProdutoDimensao *d in formatos) {
            if ([d.id intValue] > 0) {
               if (([formatos indexOfObject:d] < formatos.count)) {
                    [query appendString:@" AND "];
                }

                [query appendString:[NSString stringWithFormat:@" (produtoDimensao.id == %d) ",[d.id intValue]]];
            }
        }
    }

    [query appendString:[NSString stringWithFormat:@" AND altura >=  from:subtract:(%lf,multiply:by:(%lf,percErro)) AND altura <= add:to:(%lf,multiply:by:(%lf,percErro)) ",altura,altura,altura,altura]];
[query appendString:[NSString stringWithFormat:@" AND largura >=  from:subtract:(%lf,multiply:by:(%lf,percErro)) AND largura <= add:to:(%lf,multiply:by:(%lf,percErro)) ",largura,largura,largura,largura]];


    NSPredicate *predicate = [NSPredicate predicateWithFormat:query];
    [request setPredicate:predicate];

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


    return [results mutableCopy];

}

person jucajl    schedule 08.03.2016    source แหล่งที่มา


คำตอบ (1)


ฉันเกรงว่าฉันไม่เข้าใจสตริงรูปแบบของคุณ (เช่น percErro สามารถแยกตัวประกอบออกจากการเปรียบเทียบทั้งสองด้านได้) แต่คำสั่งสุดท้ายของคุณผิด: สามารถใช้การคำนวณทางคณิตศาสตร์ (พื้นฐาน) ในภาคแสดงได้ ไวยากรณ์ที่ถูกต้องอยู่ใน เอกสารประกอบสำหรับ NSExpression ในกรณีของคุณ คุณจะต้องมีสิ่งต่อไปนี้:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"divide:by:(multiply:by:(height,percErro),100) <= %@ AND divide:by:(multiply:by:(width,percErro),100) <= %@",heightInserted, widthInserted];
person pbasdf    schedule 08.03.2016
comment
ขอบคุณสำหรับคำตอบ ฉันพยายามใช้ตัวดำเนินการ NSExpression ตามที่กล่าวไว้ แต่ดูเหมือนว่าจะไม่ได้ผล จะทำงานได้หรือไม่หากเพิ่มโดยตรงใน [NSPredicate predicateWithFormat: @ ...]; อย่างที่ฉันทำเหรอ? - person jucajl; 09.03.2016
comment
คุณสามารถแก้ไขโพสต์ของคุณเพื่อแสดงสิ่งที่คุณได้ลองไปแล้ว และคุณได้รับข้อผิดพลาด/ผลลัพธ์อะไรบ้าง ขอบคุณ. - person pbasdf; 09.03.2016
comment
@jucajl ขอบคุณ ฉันคิดว่าสูตรที่คุณใช้อาจจะผิด (เทียบเท่ากับ searchHeight ›= height AND (searchHeight * percErro) ‹= (height * percErro) ซึ่งจะเป็นจริงก็ต่อเมื่อ searchHeight == height คุณช่วยอธิบายเกณฑ์ที่คุณต้องการได้ไหม เพื่อจับคู่กับ? - person pbasdf; 09.03.2016
comment
ลองนึกภาพว่าผู้ใช้ป้อนค่าความสูง: 8.0 ความกว้าง: 15 สมมติว่า percErro ของผลิตภัณฑ์ทั้งหมดคือ 0.05 ดังนั้นแบบสอบถามจะมีลักษณะดังนี้ 8.0 ›=databaseHeight AND (8.0 * 0.05) ‹= (databaseheight * 0.05) ฉันมี สินค้าที่มีขนาด 8.5 x 18.0 แสดงว่าการค้นหาควรส่งคืน แต่ไม่ได้เป็นเช่นนั้น - person jucajl; 09.03.2016
comment
@jucajl ขออภัยถ้าฉันป้าน แต่ฉันยังไม่เข้าใจเกณฑ์การค้นหาของคุณ ด้วยค่าตัวอย่างของคุณ ข้อแรก (8.0 ›= 8.5) เป็นเท็จ แต่ฉันคิดว่าเราอาจต้องการความคิดเห็นมากเกินไป คุณต้องการพูดคุยเรื่องนี้ในแชทไหม? - person pbasdf; 09.03.2016
comment
เลยเข้าค่า 8.6 ไม่เจอบันทึก คุยกันในแชทได้เลย ไม่เคยใช้ เลยไม่รู้จะโทรหายังไงรอติดต่ออยู่ครับ - person jucajl; 09.03.2016
comment
ให้เราสนทนาต่อในการแชท - person pbasdf; 09.03.2016
comment
ฉันแก้ไขกรณีนี้แล้วและกำลังแก้ไขปัญหาด้วยตรรกะที่ไม่ถูกต้อง อัปเดตคำถามและเพิ่มวิธีแก้ปัญหา จากนั้นสรุปว่าตัวดำเนินการทางคณิตศาสตร์ทำงานใน NSPredicate แต่ต้องเขียนตามเอกสารประกอบของลิงก์นี้:developer.apple. com/library/mac/documentation/Cocoa/อ้างอิง/: - person jucajl; 09.03.2016
comment
@jucajl ขอบคุณ - ดีใจที่คุณได้เรียงลำดับตรรกะแล้ว - person pbasdf; 09.03.2016