2013-08-09 35 views
9

Tôi đang viết một ứng dụng có cơ sở dữ liệu ảnh. Mỗi bức ảnh có một số thẻ liên kết với nó và ứng dụng có một trang tìm kiếm với rất nhiều chuyển đổi cho phép người dùng tìm kiếm các bức ảnh chỉ dựa trên các thẻ mà họ quan tâm. Mỗi thẻ trong số các thẻ này đã lưu trữ số nguyên ID vì chúng tương ứng với ID của cơ sở dữ liệu bên ngoài, vì vậy tôi đang cố gắng tìm kiếm chúng chỉ bằng ID. Tất cả các trường ID được lập chỉ mục.Các hợp đồng dành cho iOS

Sự cố xảy ra khi các biến vị ngữ mà tôi viết trở nên khá lớn vì người dùng có thể chọn từ nhiều thẻ khác nhau để lọc. Các thẻ này được nhóm thành 3 danh mục [ấn phẩm, nhãn hiệu & sản phẩm] và do đó truy vấn của tôi được thiết lập thành 'OR'ed trong một danh mục và' AND 'trên các danh mục này.

Một truy vấn Ví dụ vị kết thúc lên tìm kiếm một cái gì đó như thế này:

(parentPublication.publicationId==1 OR parentPublication.publicationId==2 OR parentPublication.publicationId==5) 
AND (ANY brands.brandId==12 OR ANY brands.brandId==2 OR ANY brands.brandId==0 OR ANY brands.brandId==3 OR ANY brands.brandId==5 OR ANY brands.brandId==6 OR ANY brands.brandId==7) 
AND (ANY products.productId==2 OR ANY products.productId==3 OR ANY products.productId==6) 

Họ có thể nhận được lớn hơn nhiều, nhưng bạn sẽ có được điểm. Vấn đề của tôi là, vì tất cả những điều này là thực hiện các kết nối đắt tiền, khi người dùng chọn nhiều hơn 10 hoặc 15, các truy vấn chạy rất dài và thậm chí có thể khiến ứng dụng gặp sự cố.

Nó có vẻ như nó sẽ hiệu quả hơn để viết một cái gì đó như:

parentPublication.publicationId IN (1,2,5) 
AND (ANY brands.brandId IN (12,2,0,3,5,6,7)) 
AND (ANY products.productId IN (2,3,6)) 

Nhưng tôi dường như không thể có được cú pháp đó để làm việc.

Vì vậy, câu hỏi của tôi là: loại cú pháp này có được hỗ trợ không và nếu có, ai đó có thể chỉ cho tôi cách viết đúng không?

Hoặc có cách nào tốt hơn để tiếp cận loại truy vấn này với Core Data cùng nhau không?

Trả lời

16

vị Sử dụng bộ sưu tập, như

[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs]; 
[NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs]; 
[NSPredicate predicateWithFormat:@"product.productID in %@", productIDs]; 

Bây giờ bạn chỉ cần có để giữ ba mảng của các thuộc tính và thực hiện một ba chiều phức hợp ngữ với andPredicateWithSubpredicates.

[NSCompoundPredicate andPredicateWithSubPredicates:@[ 
    pubPredicate, brandPredicate, productPredicate]]; 

Nên thực hiện OK.

+0

Cảm ơn @Mundi, nhưng bất cứ khi nào tôi cố gắng sử dụng cú pháp nó mang lại cho tôi một lỗi: Không thể phân tích các chuỗi định dạng "BẤT CỨ brands.brandId IN ( 12, 0,)"' –

+0

Hãy thử với TẤT CẢ CÁC. Nếu nó hoạt động, tôi sẽ sửa đổi câu trả lời của tôi. – Mundi

+0

Cùng một kết quả: 'NSInvalidArgumentException', lý do: 'Không thể phân tích chuỗi định dạng "TẤT CẢ thương hiệu.brandId IN ( 12, 0,)"'. Có vẻ như cấu trúc mảng được chuyển đến mệnh đề 'IN' không được phép hoặc không được định dạng đúng –

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