2016-09-29 25 views
11

Tôi có rất nhiều trường ngày trong mô hình cơ sở dữ liệu của mình. CoreData cho phép sử dụng NSDate hoặc TimeInterval để lưu ngày tùy thuộc vào tùy chọn "Sử dụng Scalar Type".Sử dụng ngày của Swift với CoreData

enter image description here

Tuy nhiên cả hai tùy chọn là xấu đối với tôi kể từ khi tôi muốn sử dụng ngày càng Date đối tượng. Vì NSDate không được chuyển đổi hoàn toàn thành Date Tôi phải truyền/chuyển đổi các giá trị thành Date hoặc để triển khai rất nhiều trình cài đặt/getters tùy chỉnh trong các lớp NSManagedObject của tôi.

Tôi đã cố gắng sử dụng ValueTransformer nhưng không hoạt động với các lớp không phải @ objc như Date.

Vì vậy, có cách đơn giản để lưu và nhận các giá trị Date đến/từ CoreData?

Trả lời

25

Có, nhưng bạn có thể không thích. Nếu bạn khai báo thuộc tính bằng cách sử dụng Dữ liệu cốt lõi "Ngày", hãy nhập để Xcode tạo lớp con NSManagedObject cho bạn, thuộc tính sẽ là thuộc tính @NSManaged thuộc loại NSDate. Như bạn đã tìm ra, sau đó bạn phải tự mình xử lý số điện thoại Date so với số NSDate.

Nếu bạn không hãy Xcode tạo ra các lớp con cho bạn (trong Xcode 8 set "codegen" thành "Manual/Không"), bạn có thể khai Core Data "hẹn hò" bất động sản như một cái gì đó giống như

@NSManaged public var timestamp: Date? 

Nó sẽ chỉ hoạt động. Bạn có thể đọc và viết các giá trị Date và Dữ liệu cốt lõi sẽ làm điều đúng. Nhưng bạn hoàn toàn chịu trách nhiệm về mã trong lớp con NSManagedObject. Bạn sẽ phải tạo cả lớp. Nếu bạn cập nhật mô hình Dữ liệu cốt lõi, bạn sẽ phải cập nhật lớp học. Cho dù điều này có vẻ đáng giá tùy thuộc vào bạn nhưng đó là giải pháp duy nhất dường như tồn tại ngay bây giờ.

Cập nhật: Trong Xcode 9, mã được tạo sử dụng Date, vì vậy điều này không cần thiết nữa.

+1

Đó là cách duy nhất, trong Xcode 8. Gửi yêu cầu nâng cao với Apple và có thể nó sẽ được cập nhật trong tương lai. –

+0

Tôi vừa mới nhận thấy bạn đã viết một cuốn sách về CoreData. Vì vậy, có vẻ như không có ý nghĩa để chờ đợi một giải pháp khác :) Cảm ơn một lần nữa. – Avt

+4

Còn tùy chọn để đặt "Codegen" thành "Manual/None" thì thay vì tự tạo toàn bộ lớp, chỉ cần chọn mô hình của bạn ở bên trái và từ menu chọn "Editor -> Create NSManagedObjectSubclass"? Mà tạo ra các lớp học cho bạn, sau đó tất cả các bạn phải làm là thay đổi NSDate của ngày. Bạn sẽ phải làm điều này mỗi khi bạn cập nhật mô hình. – oyalhi

3

Có một giải pháp thay thế ở đây hoạt động, nếu bạn đặt nó là có thể biến đổi và đặt lớp tùy chỉnh thành Date nó chỉ hoạt động.

Transformable date

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