Tôi mới sử dụng Dữ liệu Chính. Tôi đã nhận thấy rằng các loại bộ sưu tập không có sẵn dưới dạng loại thuộc tính và muốn biết cách hiệu quả nhất là lưu trữ dữ liệu kiểu mảng/từ điển dưới dạng thuộc tính (ví dụ: các thành phần tạo thành địa chỉ như đường phố, thành phố, v.v. không yêu cầu một thực thể riêng biệt và được lưu trữ thuận tiện hơn như một từ điển/mảng hơn các thuộc tính/trường riêng biệt). Cảm ơn bạn.Thực tiễn tốt nhất? - Mảng/Từ điển là Thuộc tính Thực thể Dữ liệu Chính
Trả lời
Không có loại mảng hoặc từ điển "gốc" nào trong Dữ liệu chính. Bạn có thể lưu trữ một số NSArray
hoặc NSDictionary
làm thuộc tính có thể biến đổi. Điều này sẽ sử dụng NSCoding
để tuần tự hóa mảng hoặc từ điển thành thuộc tính NSData
(và giải thích một cách thích hợp khi truy cập). Ưu điểm của phương pháp này là dễ dàng. Nhược điểm là bạn không thể truy vấn vào mảng hoặc từ điển (nó được lưu trữ dưới dạng BLOB trong kho dữ liệu) và nếu các bộ sưu tập lớn, bạn có thể phải di chuyển rất nhiều dữ liệu đến/từ kho dữ liệu (nếu nó một kho lưu trữ dữ liệu SQLite) chỉ để đọc hoặc sửa đổi một phần nhỏ của bộ sưu tập.
Cách khác là sử dụng Dữ liệu cốt lõi cho nhiều mối quan hệ để mô hình ngữ nghĩa của mảng hoặc bộ sưu tập từ điển. Mảng dễ dàng hơn, vì vậy hãy bắt đầu với điều đó. Dữ liệu cốt lõi cho nhiều mối quan hệ thực sự là mô hình hóa một bộ, vì vậy nếu bạn cần chức năng giống như mảng, bạn phải sắp xếp tập hợp (sử dụng thuộc tính được tìm nạp là cách thuận tiện để thực hiện việc này) hoặc thêm thuộc tính chỉ mục bổ sung vào thực thể lưu trữ các mục mảng và tự quản lý các chỉ mục. Nếu bạn đang lưu trữ một mảng đồng nhất (tất cả các mục có cùng kiểu), thật dễ dàng để mô hình hóa mô tả thực thể cho các thực thể mảng. Nếu không, bạn sẽ phải quyết định có nên sử dụng thuộc tính có thể biến đổi để lưu trữ dữ liệu mục hoặc tạo một họ các thực thể mục hay không.
Tạo mô hình từ điển có thể sẽ yêu cầu mối quan hệ nhiều với một tập hợp các thực thể lưu trữ khóa và giá trị. Cả khóa và giá trị đều giống với thực thể mục cho mảng, được mô tả ở trên. Vì vậy, chúng có thể là các kiểu gốc (nếu bạn biết chúng trước), một thuộc tính có thể biến đổi hoặc một mối quan hệ với một cá thể từ một nhóm các thực thể kiểu cụ thể.
Nếu tất cả điều này nghe có vẻ hơi khó khăn, đúng vậy. Việc thu thập dữ liệu tùy ý vào một khuôn khổ phụ thuộc vào lược đồ như Core Data là khó khăn.
Đối với dữ liệu có cấu trúc, như địa chỉ, hầu như luôn dễ dàng hơn để dành thời gian lập mô hình các thực thể một cách rõ ràng (ví dụ: thuộc tính cho từng phần của địa chỉ). Bên cạnh việc tránh tất cả mã phụ để tạo mô hình từ điển, điều này làm cho giao diện người dùng của bạn dễ dàng hơn (và các ràng buộc sẽ "chỉ hoạt động") và logic xác thực của bạn vv rõ ràng hơn vì phần lớn dữ liệu có thể được xử lý bởi Dữ liệu cốt lõi.
Cập nhật
Tính đến OS X 10.7, Core Dữ liệu bao gồm một loại tập có thứ tự mà có thể được sử dụng ở vị trí của một mảng. Nếu bạn có thể nhắm mục tiêu 10.7 trở lên, đây là giải pháp tốt nhất cho các bộ sưu tập được sắp xếp (giống như mảng).
Đã xác nhận thứ hai - đã xác nhận những gì tôi đã nghĩ nhưng tôi không biết về các thuộc tính có thể biến đổi. – jkp
@Barry Vì vậy, tôi tò mò, khi nào sẽ là thời gian "chính xác" để sử dụng biến đổi? Giả sử thực thể của tôi có một chuỗi các chuỗi, mảng không chứa nhiều hơn 100 mục và chuỗi là một từ tiếng Anh trung bình, liệu có thể sử dụng biến đổi không? – pixelfreak
@pixelfreak Sử dụng biến đổi tùy thuộc vào * cách * bạn cần sử dụng các mục trong bộ sưu tập. Nếu bạn cần truy vấn đối với họ hoặc bạn muốn có thể tải một số hoặc tất cả chúng một cách lười biếng, thuộc tính có thể biến đổi sẽ không hoạt động. Nếu bạn không cần tải chậm, không cần phải truy vấn và luôn cần * tất cả * của các mục hoặc không, một thuộc tính có thể biến đổi có thể làm việc cho bạn (và chắc chắn là dễ thực hiện). –
Tôi gặp sự cố tương tự. Trong trường hợp của tôi, tôi muốn ánh xạ một mảng các chuỗi. Tôi theo lời khuyên của Barry và cuối cùng cũng làm việc. Dưới đây là những gì một số mã trông giống như (mà hy vọng sẽ làm rõ mọi thứ cho bất cứ ai khác chạy vào điều này) ...
My Entity trông giống như sau:
@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end
của tôi Quản lý Object Model Mã (Core Data) mã trông giống như sau:
NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];
NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];
[entityDescription setProperties:appointmentSearchResponseProperties];
Vì vậy, các mặt hàng quan trọng ở đây là:
- Tôi đang sử dụng NSSet cho loại thuộc tính
- Tôi đang sử dụng NSTransformableAttributeType làm kiểu thuộc tính trong Mô hình đối tượng được quản lý dữ liệu lõi.
Vì vậy, bạn đã đặt mã này bên trong AppointmentSearchResponse.m trong một phương thức init? – Chicowitz
Tạo một thực thể có các trường chuỗi cho địa chỉ có thể dễ sử dụng hơn từ điển mà bạn phải nhớ khóa ... – Daniel