Lakukan perhitungan dengan bidang database di NSPredicate Core Data

Saya membuat metode untuk memulihkan produk dari database saya, setiap item memiliki bidang tinggi, lebar dan percErro (persentase kesalahan),

Pengguna memasukkan lebar dan tinggi yang ingin dicari, misal: 15 x 15cm

Kemudian metode tersebut harus menghasilkan produk yang kompatibel dengan nomor-nomor ini, dengan mempertimbangkan persentase kesalahan yang diperbolehkan dalam pendaftarannya.

Misalkan produk yang ada di database berukuran 14 x 14cm dan persentase errornya 10% (1,4cm), maka Anda mencari produk yang berukuran 15 x 15cm

Dalam permintaan saya, saya harus melakukan sesuatu seperti ini:

[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];

Ini akan memberikan saya semua produk yang persentase kesalahannya tidak melebihi 10% (1,4 cm)

Saya tahu NSPredicate tidak menerima operasi matematika, bagaimana saya bisa mendapatkan hasil penghitungan persentase kesalahan ini?

**

Terselesaikan

**

Saya menerima jawaban pbasdf dan menyimpulkan bahwa operator matematika berfungsi di NSPredicate, tetapi harus ditulis sesuai dengan dokumentasi tautan ini: Dokumentasi

Di bawah metode fungsional 100% saya dengan operator:

-(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 sumber


Jawaban (1)


Saya khawatir saya tidak memahami string format Anda (percErro dapat diperhitungkan dari kedua sisi perbandingan, misalnya). Namun pernyataan terakhir Anda salah: adalah mungkin menggunakan perhitungan matematis (dasar) dalam predikat. Sintaks yang benar ada di dokumentasi untuk NSExpression. Dalam kasus Anda, Anda memerlukan sesuatu seperti ini:

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
Terima kasih atas tanggapan Anda, saya mencoba menggunakan operator NSExpression seperti yang disebutkan, namun sepertinya tidak berhasil, apakah akan berfungsi jika langsung ditambahkan di [NSPredicate predicateWithFormat: @ ...]; seperti yang saya lakukan? - person jucajl; 09.03.2016
comment
Bisakah Anda mengedit postingan Anda untuk menunjukkan apa yang telah Anda coba, dan kesalahan/hasil apa yang Anda dapatkan? Terima kasih. - person pbasdf; 09.03.2016
comment
@jucajl Terima kasih. Saya rasa rumus yang Anda gunakan mungkin salah (setara dengan searchHeight ›= height AND (searchHeight * percErro) ‹= (height * percErro), yang hanya akan benar jika searchHeight == height. Bisakah Anda menjelaskan kriteria apa yang Anda inginkan untuk bertanding melawan? - person pbasdf; 09.03.2016
comment
Bayangkan pengguna memasukkan nilai tinggi: 8.0 lebar: 15, asumsikan percErro semua produk adalah 0.05 maka kueri akan terlihat seperti ini 8.0 ›= databaseHeight AND (8.0 * 0.05) ‹= (databaseheight * 0.05), saya punya produk yang memiliki 8.5 x 18.0, maka harus dikembalikan melalui pencarian, tetapi ternyata tidak. - person jucajl; 09.03.2016
comment
@jucajl Maaf jika saya bersikap tumpul, tapi saya masih tidak memahami kriteria pencarian Anda. Dengan nilai contoh Anda, klausa pertama (8.0 ›= 8.5) salah. Namun menurut saya kami mungkin memerlukan terlalu banyak komentar: apakah Anda ingin mendiskusikannya dalam obrolan? - person pbasdf; 09.03.2016
comment
Jadi walaupun memasukkan nilai 8.6, tidak ada catatan yang ditemukan, kita bisa ngobrol di chat, saya tidak pernah menggunakannya, jadi saya tidak tahu bagaimana cara menelepon Anda, saya menunggu Anda untuk menghubungi. - person jucajl; 09.03.2016
comment
Mari kita melanjutkan diskusi ini di chat. - person pbasdf; 09.03.2016
comment
Saya memecahkan kasus ini dan menguliti masalah dengan logika yang salah, memperbarui pertanyaan dan menambahkan solusi, kemudian menyimpulkan bahwa operator matematika berfungsi di NSPredicate, tetapi harus ditulis sesuai dengan dokumentasi tautan ini:developer.apple. com/library/mac/documentation/Cocoa/Reference/: - person jucajl; 09.03.2016
comment
@jucajl Terima kasih - senang logika Anda sudah terurut. - person pbasdf; 09.03.2016