2010-10-17 29 views
10

Tôi cần phải tạo một NSPredicate với nhiều phần dữ liệu. Ví dụ trong SQL tôi sẽ làm một cái gì đó như sau:Cách tốt nhất để xây dựng một NSCompoundPredicate phức tạp là gì?

SELECT * 
    FROM TRANSACTIONS 
    WHERE CATEGORY IN (categoryList) 
    AND LOCATION IN (locationList) 
    AND TYPE IN (typeList) 
    AND NOTE contains[cd] "some text" 
    AND DATE >= fromDate 
    AND DATE <+ toDate 

Tôi đang phải vật lộn với cách xây dựng này như một NSPredicate để sử dụng với Core Data. Tôi đã đọc tài liệu ... chỉ cung cấp các ví dụ đơn giản. Nếu bất cứ ai có thể chỉ cho tôi một ví dụ phức tạp hơn, tôi chắc chắn sẽ đánh giá cao nó.


Vâng, tôi đã có câu trả lời ở đây trong hai năm mà nhiều người thấy hữu ích. Bài đăng của tôi đã bị xóa. Đây là URL được cập nhật với giải pháp.

https://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/

+0

Bạn đã thử nhập mệnh đề where vào vị từ. Nó có một phương pháp để xây dựng một từ chuỗi đó là khá mạnh mẽ. –

+0

Im không nhận thức được bất kỳ nơi nào cho phép tôi chỉ định một câu lệnh SQL tạo ra một vị từ. Xin cho biết. – radesix

+0

Tôi không biết tại sao bài đăng của tôi liên tục bị xóa. Bài viết này đã giúp MANY mọi người http://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/ – radesix

Trả lời

9

Những gì bạn cần làm là để tạo ra một vị ngữ cho mỗi một trong các điều khoản của bạn. Ví dụ chúng ta hãy phá vỡ truy vấn của bạn:

  1. SELECT * FROM GIAO DỊCH
  2. ĐÂU LOẠI IN (categoryList)
  3. và vị trí trong (locationList)
  4. và gõ (typeList)
  5. VÀ GHI CHÚ chứa [cd] "một số văn bản"
  6. VÀ NGÀY> = FROMNgày VÀ NGÀY < + NHCTVN

Dựa trên điều này, bạn có 5 biến vị ngữ (2-6). Vì vậy, chúng ta hãy làm việc trên từng cái một.

NSPredicate *inCategoryPredicate = [NSPredicate predicateWithFormat:@"Category IN %@", categoryList]; 

NSPredicate *locationPredicate = [NSPredicate predicateWithFormat:@"Location IN %@", locationList]; 

NSPredicate *typePredicate = [NSPredicate predicateWithFormat:@"Type IN %@", typeList]; 

NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"Note contains[c] %@", @"Some Text"]; 

NSPredicate *startDatePredicate = [NSPredicate predicateWithFormat:@"Date => @", fromDate]; 

NSPredicate *endDatePredicate = [NSPredicate predicateWithFormat:@"Date <= @", toDate]; 

Bây giờ bạn chỉ cần tham gia cùng họ vào chỉ là một vị ngữ: Apple's documentation states:

Bạn nên cấu trúc hợp chất predicates để giảm thiểu số lượng công việc thực hiện. Đối sánh cụm từ thông dụng cụ thể là hoạt động tốn kém . Trong một biến vị ngữ phức hợp, bạn nên thực hiện các phép thử đơn giản trước một cụm từ thông dụng;

Điều này được nói sau đó bạn nên bắt đầu với các vị từ "dễ" trước tiên. Vì vậy:

NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate]; 

Bạn luôn có thể có ý tưởng về vị ngữ (sql where) trông như thế nào nếu bạn NSLog nó.

+0

Có thể trả lời [câu hỏi này] (https : //stackoverflow.com/questions/46388393/create-complicated-nscompoundpredicate-in-swift-3) vui lòng? –

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