iOS - NSPredicate string.length selalu bernilai 0 ketika string dimulai dengan operator aritmatika + - * /

Saya memiliki metode sederhana yang menggunakan NSPredicate untuk mengembalikan jumlah baris di mana comments.length > 0.

Masalahnya, saya menemukan bahwa ketika kolom Komentar dimulai dengan + - * atau /, properti panjang selalu bernilai 0, dan dengan demikian baris tersebut dikecualikan dari penghitungan.

Saya membuka tabel di browser SQLite dan memverifikasi kolom tersebut adalah VARCHAR. Menggunakan kueri SQLite untuk memeriksa panjang string berfungsi dengan baik (LENGTH(ZComments) > 0), jadi ini pasti masalah CoreData.

Inilah fungsi saya...

-(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;
}

Saya dapat mengatasinya dengan memeriksa string kosong/null alih-alih menggunakan .length, tapi saya benar-benar ingin tahu mengapa .length gagal ketika string dimulai dengan karakter tertentu.

Apakah ini pernah terjadi pada seseorang?


person iupchris10    schedule 31.03.2014    source sumber
comment
Bukan penyebab kesalahan Anda, tetapi tanda tangan metode seharusnya -(NSUInteger)commentsCount. Cocokkan jenis pengembalian -countForFetchRequest:error:, dan jangan mengawali nama metode dengan get kecuali metode tersebut mengembalikan beberapa item secara tidak langsung (Konvensi Penamaan Kakao).   -  person Hal Mueller    schedule 31.03.2014


Jawaban (1)


Anda tidak dapat menggunakan fungsi Objective-C seperti length dalam permintaan pengambilan Data Inti (dan bagian ".length" diabaikan begitu saja ketika Data Inti menerjemahkan permintaan pengambilan ke kueri SQLite). Namun Anda cukup membandingkannya dengan string kosong:

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

Untuk kueri lain yang melibatkan panjangnya, Anda dapat menggunakan operator MATCHES dengan ekspresi reguler seperti yang ditunjukkan di sini: CoreData predikat: panjang properti string?.

person Martin R    schedule 31.03.2014
comment
Selain itu, alasan mengapa penggunaan .length terkadang tampak berhasil adalah karena Data Inti akan menerjemahkan comments.length > 0 ke SQL sebagai sesuatu seperti t0.ZCOMMENTS > 0, sehingga kehilangan bagian panjang kueri. Itu tampak seperti bug bagi saya, tapi itulah yang terjadi saat ini. Saya tidak tahu bagaimana SQLite mengevaluasi string dalam perbandingan > 0, tapi bukan itu yang tersirat oleh comments.length. - person Tom Harrington; 31.03.2014
comment
Penjelasan yang bagus, terima kasih! Saya bahkan memverifikasi ini dengan mengubah .length menjadi .foo dan mendapatkan hasil yang sama. Apakah ada cara yang sah untuk membandingkan panjang string menggunakan NSPredicate? Selanjutnya.... seseorang sebaiknya memberi tahu orang-orang di thread lain ini bahwa mereka melakukan kesalahan.... stackoverflow.com/questions/7369390/ - person iupchris10; 31.03.2014
comment
@iupchris10: comment.length › 0 dan yang serupa berfungsi ketika mis. menyaring array. Itu gagal hanya untuk permintaan pengambilan Data Inti (dan itu sudah disebutkan dalam satu komentar pada jawabannya). - person Martin R; 31.03.2014
comment
@iupchris10: Perbandingan panjang string lainnya dapat dilakukan dengan ekspresi reguler (seperti pada jawaban yang saya tautkan). - person Martin R; 31.03.2014
comment
@MartinR - terima kasih. Saya juga baru saja menemukan thread ini, yang menyarankan menambahkan properti panjang ke objek yang dikelola, dan mengaturnya setiap kali nilai teks diubah. - [tautan]stackoverflow.com /pertanyaan/3644621/ - person iupchris10; 31.03.2014