2010-09-29 20 views
8

hi i có cơ sở dữ liệu Core Data với các thuộc tính số. họ là NSNumbers. Giá trị mặc định là 0.0 nhưng khi tôi cố gắng để làm một số NSPredicated lấy, tôi nhận được " 'NSInvalidArgumentException', lý do: 'vị không hợp lệ: nil RHS" chỉ vì giá trị thuộc tính là 0.0NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone)

Các vị được tạo ra với:

[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)",startNSNumber,endNSNumber, idString] 

làm cách nào tôi có thể giải quyết vấn đề này?

+1

Vui lòng đăng cách bạn tạo vị từ. –

+0

Vui lòng cung cấp mã bạn sử dụng để đặt biến vị ngữ. – ohhorob

+0

biến vị ngữ: [NSPredicate predicateWithFormat: @ "(startValue =>% @) AND (endValue <% @) AND (someId ==% @)", startNSNumber, endNSNumber, idString] – Greg

Trả lời

5

Bạn đang thêm nổi dưới dạng đối tượng chứ không phải là phao? Hãy thử điều này:

[NSPredicate predicateWithFormat:@"(startValue => %f) AND (endValue <= %f) AND (someId == %@)",startNSNumber,endNSNumber, idString]; 
+0

Nếu nó là NSNumber, điều này rõ ràng sẽ không hoạt động. – Eiko

+1

'% f' được sử dụng cho nguyên thủy' float'. 'NSNumber' là một đối tượng (có nghĩa là'% @ 'là sự thay thế chính xác cho nó). –

+0

Blast, tôi misread câu hỏi và nghĩ rằng ông đã được thêm nổi :( – deanWombourne

1

Vâng, do vị mà bạn cung cấp, câu trả lời dễ dàng là:

Hoặc startNSNumber, endNSNumber hoặc idString là con số không. Nếu bạn muốn so sánh điều gì đó với số điện thoại nil trong một số NSPredicate, bạn cần phải thay thế trong [NSNull null], chứ không phải nil.

+0

vì vậy nếu (startNSNumber) { [NSPredicate predicateWithFormat: @ "(startValue =>% @), startNSNumber] } else { [NSPredicate predicateWithFormat: @ "(startValue =>% @), [NSNull null] } ?? nó có đúng không? – Greg

+0

không có NSInvalidArgumentException nữa:/ – Greg

2

Tôi tin chắc rằng một trong các biến của bạn là con số không hoặc được autoreleased ...

thử điều này:

NSNumber *num1 = [NSNumber numberWithFloat:2.0]; 
NSNumber *num2 = [NSNumber numberWithFloat:3.0]; 
NSString *str = @"Test"; 
[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)", num1, num2, str]; 

Nếu đây thành công mà vấn đề là với các biến của bạn.

Nếu bạn mong đợi một trong hai num1 hoặc num2nil đôi khi, sau đó bạn có thể viết lại vị như:

[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)", num1 ? num1 : [NSNumber numberWithFloat:0.0], num2 ? num2 : [NSNumber numberWithFloat:0.0], idString]; 
+0

yeah -.- 'vấn đề của tôi là khi num1 hoặc num2 là [số NSNumberWithFloat: 0.0 ] nhưng giá trị này là có thể và cần thiết, nhưng NSPredicate không thích nó, ném các ngoại lệ, tại sao? – Greg

+0

khá ngạc nhiên, bạn có chắc biến không phải là 'nil'? Tôi đã chạy một mã thử nghiệm với một ngắt điểm và '[Số NSNumberWithFloat: 0.0]' tạo đối tượng 'NSNumber' thích hợp ... – Nick

+0

có, thật không may tôi hoàn toàn chắc chắn :( – Greg

0

TRÊN NSpredicate sử dụng chuỗi giá trị như thả nổi từ điển key.floatValue và dễ dàng sử dụng.

[NSPredicate predicateWithFormat:@"(startValue.floatValue => %f) AND (endValue.floatValue <= %f) AND (someId == %@)",startNSNumber,endNSNumber, idString] 

Tôi làm điều này hữu ích.