Thực hành tốt nhất? - Mảng / từ điển như một thuộc tính thực thể dữ liệu cốt lõi [đã đóng]


176

Tôi chưa quen với Core Data. Tôi đã nhận thấy rằng các loại bộ sưu tập không có sẵn như các 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 loại mảng / từ điển làm thuộc tính (ví dụ: các thành phần tạo nên một đị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 dưới dạng từ điển / mảng hơn các thuộc tính / trường riêng biệt). Cảm ơn bạn.


6
Tạo một thực thể với các trường chuỗi cho địa chỉ có thể dễ sử dụng hơn một từ điển mà bạn phải nhớ các khóa của mình ...
Daniel

Câu trả lời:


247

Không có mảng hoặc từ điển "gốc" trong Dữ liệu lõi. Bạn có thể lưu trữ một NSArrayhoặc một NSDictionarythuộc tính có thể chuyể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 một NSDatathuộc tính (và giải thích hợp lý nó 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 (được lưu dưới dạng BLOB trong kho lưu trữ dữ liệu) và nếu bộ sưu tập lớn, bạn có thể phải di chuyển nhiều dữ liệu đến / từ kho lưu trữ dữ liệu (nếu đó là một kho 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 lõi cho nhiều mối quan hệ để mô hình hóa ngữ nghĩa của bộ sưu tập mảng hoặc từ điển. Mảng dễ 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ự mô hình hóa một tập hợp, 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 tìm nạp là một 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 đều cùng loại), thật dễ dàng để mô hình 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ể chuyển đổi để lưu trữ dữ liệu vật phẩm hay tạo một họ các thực thể vật phẩm hay không.

Mô hình hóa một từ điển có thể sẽ yêu cầu một mối quan hệ nhiều đến một tập hợp các thực thể lưu trữ một khóa và một giá trị. Cả khóa và giá trị đều tương tự 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 nguyên gốc (nếu bạn biết chúng trước thời hạn), một thuộc tính có thể chuyển đổi hoặc mối quan hệ với một thể hiện từ một họ các thực thể cụ thể kiểu.

Nếu tất cả điều này nghe có vẻ hơi nản chí, nó là. Việc sắp xếp dữ liệu tùy ý vào một khung phụ thuộc 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 dành thời gian mô hình hóa các thực thể một cách rõ ràng (ví dụ: một thuộc tính cho từng phần của địa chỉ). Bên cạnh việc tránh tất cả các mã bổ sung để mô hình hóa một 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 (các ràng buộc sẽ "chỉ hoạt động") và logic xác thực của bạn, v.v. rõ ràng hơn vì phần lớn có thể được xử lý bởi Core Data.

Cập nhật

Kể từ OS X 10.7, Core Data bao gồm loại tập hợp được đặt hàng có thể được sử dụng thay cho 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).


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ể chuyển đổi.
jkp

3
@pixelfreak Việc sử dụng biến đổi phụ 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 chống lại chúng hoặc bạn muốn có thể tải một cách lười biếng một số hoặc tất cả chúng, một thuộc tính có thể chuyển đổi sẽ không hoạt động. Nếu bạn không cần lười tải, không cần truy vấn và luôn cần tất cả các mục hoặc không có gì, một thuộc tính có thể chuyển đổi có thể phù hợp với bạn (và chắc chắn rất dễ thực hiện).
Barry Wark

3
Những gì Barry nói được mô tả chi tiết hơn trong Hướng dẫn lập trình dữ liệu cốt lõi, chương Các thuộc tính liên tục không chuẩn .
Palimondo

2
Lưu ý thận trọng về các bộ được đặt hàng: không sử dụng chúng cho nhiều mối quan hệ với hơn một vài nghìn đối tượng ở nhiều phía. Nếu bạn làm như vậy, việc lưu có thể bắt đầu mất nhiều thời gian đến nỗi nó chặn chuỗi.
Kirk van Gorkom

2
Tôi không hiểu về "bộ đã đặt hàng mới". Nó có phải là một thuộc tính? Bởi vì tôi không thể nhìn thấy nó trong menu loại thuộc tính.
Lô đất

11

Tôi đã có một vấn đề tương tự. Trong trường hợp của tôi, tôi muốn ánh xạ một chuỗi các chuỗi. Tôi đã làm theo lời khuyên của Barry và cuối cùng nó đã hoạt động. Đây là một số mã trông như thế nào (hy vọng sẽ làm rõ mọi thứ cho bất kỳ ai khác gặp phải vấn đề này) ...

Thực thể của tôi trông giống như thế này:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

Mã quản lý mô hình đối tượng (dữ liệu cốt lõi) của tôi trông giống như thế này:

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ục chính ở đây là:

  • Tôi đang sử dụng NSSet cho loại thuộc tính
  • Tôi đang sử dụng NSTransformableAttributionType làm loại 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 sẽ đặt mã này trong AppointmentSearchResponse.m trong một phương thức init?
Chicowitz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.