2011-01-17 11 views
20

Tôi có thuộc tính int32 trong cơ sở dữ liệu lõi. Tôi sử dụng trường này int làm trường bit enum.Làm cách nào để sử dụng cờ nhị phân trong Dữ liệu chính?

Có thể tạo NSPredicate để truy vấn các mục dựa trên giá trị nhị phân của int này không? Một cái gì đó như @"bitFieldAttribute & 0x0001"?

Tôi cũng tự hỏi liệu điều này có thể thực hiện với thuộc tính được nhập nhị phân không?

Trả lời

25

NSPredicate có thể xử lý, nhưng tôi không chắc liệu CoreData có chấp nhận nó làm vị từ hợp lệ để thực thi trên kho dữ liệu hay không. Nó có thể gặp sự cố khi chuyển đổi toán tử bitwise thành truy vấn SQL (nếu bạn đang sử dụng một cửa hàng sao lưu SQLite). Bạn sẽ phải thử nó.

Cú pháp, tuy nhiên, chỉ là những gì bạn mong muốn:

NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"]; 
NSLog(@"%@", p); 
NSLog(@"%d", [p evaluateWithObject:nil]); 

Logs:

3 & 1 > 0 
1 

Như để làm điều này trên một thuộc tính nhị phân, đánh máy (ví dụ, một trong những định nghĩa là data Điều này có lẽ sẽ không hoạt động. Bitwise khai thác chỉ thực sự có ý nghĩa khi hoạt động trên số nguyên (trong khi tôi hiểu chúng), do đó, thực hiện nó trên một NSData sẽ không có ý nghĩa nhiều. Chuyển đổi nó thành một số đầu tiên, và sau đó nó có thể làm việc.

chỉnh sửa

Nó sẽ xuất hiện mà SQLite hỗ trợ cú pháp này, vì bitwise operators have been around since 2001, có nghĩa là Core Data có thể sẽ chấp nhận nó là tốt.

+0

Đó là công trình !!!! Cảm ơn rất nhiều ! Tôi đã rất không rõ ràng rằng CodeData sẽ dịch sang SQL nhưng tôi đã thử nghiệm nó và nó có vẻ hoạt động. – CodeFlakes

+0

Hầu như luôn an toàn hơn để kiểm tra '(x & bit)! = 0' thay vì' (x & bit)> 0'. Lý do là thiết lập bit cao nhất có thể biến số âm. Chỉ có ngoại lệ là khi bạn hoàn toàn chắc chắn số không được ký. – HughHughTeotl

-1

Tôi hầu như không nghi ngờ điều đó.

Nhưng bạn có thể sử dụng enum cho các giá trị được lưu trữ trong thuộc tính và sử dụng so sánh trực tiếp thay vì che một chút.

+0

Tôi không hiểu ý bạn là gì. Những gì tôi muốn làm là tìm nạp các thực thể phù hợp với các giá trị bit nhất định (không giới hạn trong cùng một chuỗi bit chính xác). – CodeFlakes

+0

Bạn có thể cung cấp một ví dụ về lý do tại sao bạn cần kỹ thuật che mặt nạ bit? –

+0

@CiprianL. ở đây nó là: tôi có một loạt các thực thể, đại diện cho các sinh vật (rất nhiều sinh vật), và tôi có một loạt các thế giới (như 16 hoặc hơn), nơi tôi nên trình bày những sinh vật đó.Cùng một sinh vật có thể được trình bày trong nhiều thế giới. Vì vậy, bây giờ, tôi cần phải lấy các sinh vật mà nên được trình bày trong thế giới 'A',' B' và 'D' – igrek

8

Dưới đây là một ví dụ/ứng dụng của kỹ thuật này.

Giả sử bạn có NSManagedObject có thuộc tính số nguyên với đường phím "typeValue".

Một nơi nào đó trong mã của bạn định nghĩa một enumeration Bitwise:

typedef enum SomeType { 
    SomeTypeValueOne = 0x1, 
    SomeTypeValueTwo = 0x2, 
    SomeTypeValueThree = 0x4 
} SomeType; 

Bây giờ để truy vấn cho các đối tượng được quản lý có kiểu nói Một hoặc Ba nhưng không phải hai, làm như sau:

SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree; 

NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == typeValue", valueOneOrThree]; 

// construct NSFetchRequest as normal with predicate... 
7

rockfakie gần như đúng nhưng

NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree]; 

Là những gì tôi cần.

+0

Hnmm, tôi đang nhận được BarDing CoreData với lỗi "'NSInvalidArgumentException', lý do: 'Biểu thức chức năng không được hỗ trợ bị cấm & 8" với cụm từ '(bị cấm & 8) == 0' – chadbag

+0

Bạn có thể đăng toàn bộ định nghĩa NSPredicate không? –

+0

đã được sửa. Là một typo ngu ngốc của tên tài sản do một fart não (đã được đối phó với phía mysql rằng các ứng dụng sử dụng để cư các đối tượng của nó và sử dụng tên cột mysql thay vì tên tài sản CD). Cảm ơn. – chadbag