2012-03-22 36 views
6

Điều này nghĩa là lái xe cho tôi.iOS Core Data làm thế nào để so sánh đúng chuỗi văn bản bằng cách sử dụng vị từ?

Tôi có 2 thực thể sử dụng NSStrings làm thuộc tính duy nhất.

Cách chính xác để tạo vị từ so sánh NSStrings là gì?

Hiện tại tôi có: [Vị từ xác định chính xácWithFormat: @ "unique =% @", uniqueValue];

Tôi có cảm giác rằng điều này so sánh địa chỉ con trỏ, không phải giá trị chuỗi thực tế, nhưng tôi không thể xác nhận điều đó. Tôi cần phải trả lại có cho một kết hợp chuỗi chính xác.

-(BOOL)uniqueEntityExistsWithEnityName:(NSString*)entityName UniqueKey:(NSString*) uniqueKey UniqueValue:(NSString*)uniqueValue SortAttribute:(NSString*)sortDescriptorAttribute ManagedObjectContext:(NSManagedObjectContext*) context; 
{ 
    BOOL returnValue = NO; 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

//what is the correct predates to compare the text an string core data property against a passed in string? 
    request.predicate = [NSPredicate predicateWithFormat:@"unique= %@", uniqueValue]; 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:sortDescriptorAttribute ascending:YES]; 
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    NSError *error = nil; 
    NSArray *matches = [context executeFetchRequest:request error:&error]; 
    if (!matches) 
    { 
     NSLog(@"Error: no object matches"); 
    } 
    else if([matches count] > 1) { 
     NSLog(@"Error: More than one object for unique record"); 
     returnValue = YES; 

    } else if ([matches count] == 0) { 
     returnValue = NO; 
    } else { 
     returnValue = YES; 
    } 

    return returnValue; 
} 
+0

Bạn có cảm giác hoặc vấn đề thực tế không? Mã của bạn có vẻ ổn. Dữ liệu của bạn được tìm nạp từ cơ sở dữ liệu sqlite, nó nên khớp với địa chỉ con trỏ như thế nào? –

Trả lời

9

Dấu bằng đơn không phải là một bộ so sánh về mặt mã hóa.

Tôi sẽ giả định duy nhất là thuộc tính NSManagedObject.

[NSPredicate predicateWithFormat:@"unique LIKE %@", uniqueValue]; 

Lưu ý rằng đây là trường hợp nhạy cảm. Nếu bạn muốn làm cho nó không nhạy cảm, thì bạn có thể đặt [c] sau LIKE.

+0

Cảm ơn Kevin, tôi sẽ kiểm tra nó! –

+12

một dấu bằng đơn là hoàn hảo để sử dụng trong một NSPredicate. –

+0

Ồ! Tôi đoan la bạn đung! Wow, có vẻ như kỳ quặc sẽ là trường hợp (cho rằng ở mọi nơi khác trong mã hóa một dấu bằng nhau là một bài tập). –

7

Tôi không thấy sự cố với biến vị ngữ của bạn. Một = là hoàn hảo nếu bạn muốn khớp chính xác với chuỗi. Nếu bạn không cần ký tự đại diện phù hợp, bạn không cần LIKE chậm hơn. (Predicate Format String Syntax)

Tuy nhiên, có sự cố trong mã của bạn và có thể dẫn bạn đến các giả định không chính xác. Nếu/sau đó/người khác của bạn, hoặc ít nhất là thông báo đầu tiên là sai. Nếu bạn tìm nạp không trả lại một mảng thì có nghĩa là tìm nạp không thành công, điều đó không có nghĩa là tìm nạp không trả về các đối tượng.

Nó nên được nhiều như thế này:

if (!matches) 
{ 
    NSLog(@"Error: couldn't execute fetch request %@", error); 
} 
else if([matches count] > 1) { 
    NSLog(@"Error: More than one object for unique record"); 
    returnValue = YES; 
} else if ([matches count] == 0) { 
    NSLog(@"couldn't match objects"); 
    returnValue = NO; 
} else { 
    // [matches count] == 1 
    NSLog(@"matched one object"); 
    returnValue = YES; 
} 

Oh, và tôi sẽ thay đổi thứ tự của các điều kiện. Theo ý kiến ​​của tôi, một cấu trúc như (! Matches), ([match count] == ​​1), ([match count] == ​​0), (else) có ý nghĩa hơn và nó dễ đọc hơn. Bạn đặt điều quan trọng nhất (vì nó là điều bạn thực sự muốn) trong "ẩn danh" cuối cùng khác.

Các vấn đề liên quan