2016-05-22 20 views
5

Tôi đang viết một ứng dụng trong Swift 2.2 nhắm mục tiêu iOS 8 và sử dụng Realm. Tôi cho phép người dùng sắp xếp các đối tượng dựa trên các thuộc tính tùy chọn khác nhau sử dụng Results.sorted(_:ascending:). Điều này làm việc rất tốt cho các loại giảm dần nhưng đối với các loại tăng dần, nil giá trị được đặt đầu tiên mà không nhìn đúng. Nhiều hệ thống cơ sở dữ liệu có tùy chọn NULLS FIRST/LAST và với CoreData, có vẻ như có thể subclass NSSortDescriptor. Có cách nào để luôn đặt giá trị nil cuối cùng khi sắp xếp trong Realm không? Ngay cả khi chỉ có một chiến lược hacky, điều đó cũng sẽ được đánh giá cao.Realm Swift: luôn đặt giá trị nil cuối cùng trong loại

Trả lời

4

Lĩnh vực không hỗ trợ sắp xếp tùy chỉnh Results ngoài phương thức Results.sorted(_:ascending:) cung cấp cho bạn. Nhưng bạn có thể soạn này mình khá dễ dàng bằng cách kết hợp hai truy vấn, thậm chí có thể phơi bày rằng thông qua một tài sản tính:

var results: [MyModel] { 
    let sorted = realm.objects(MyModel).sorted("...", ascending: true) 
    return sorted.filter("optionalProperty != nil") + 
     sorted.filter("optionalProperty == nil") 
} 
0

Trong trường hợp của tôi, nhiều truy vấn sẽ rất khó khăn bởi vì trong nhiều trường hợp nguồn dữ liệu của tôi đã thực hiện điều đó với ưu tiên phân loại khác và tôi chỉ cần phân loại tùy chỉnh này trong một trường hợp. Nó cũng rất có thể cho có được hàng trăm hoặc hàng ngàn kết quả, mà tôi không muốn giữ trong bộ nhớ bằng cách kết nối các kết quả.

Vì vậy, trong khi đây không phải là lý tưởng, tôi đã chọn để lưu trữ một tài sản được cập nhật tự động bởi một tài sản tính date: Date? với một setter tùy chỉnh mà cập nhật được lưu trữ startDate: Date?hasStartDate tính hasStartDate: Bool. hasStartDate cũng được đặt trong trình khởi tạo của tôi cho đối tượng.

này cho phép tôi sử dụng:

realm.objects(SMItem.self).filter(predicate).sorted(by: [ 
    SortDescriptor(keyPath: "hasStartDate", ascending: false), 
    SortDescriptor(keyPath: "startDate", ascending: true) 
]) 

này trả về đối tượng với một tăng dần startDate, tiếp theo là đối tượng mà không có một startDate.

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