2010-12-28 35 views
29

Tôi đã tìm kiếm một số mã mẫu về cách lưu trữ NSArray trong Dữ liệu cốt lõi trong một thời gian, nhưng chưa có bất kỳ sự may mắn nào. Có ai tâm trí chỉ cho tôi một số hướng dẫn hoặc ví dụ, hoặc tốt hơn chưa viết một mẫu đơn giản như là một câu trả lời cho câu hỏi này? Tôi đã đọc this nhưng không hiển thị ví dụ về cách thực hiện thuộc tính có thể biến đổi là NSArray. Cảm ơn trước!Lưu trữ NSArray trong mã mẫu dữ liệu cốt lõi?

+0

Vui lòng tham khảo http://stackoverflow.com/questions/29825604/how-to-save-array-to-coredata/40101654#40101654 –

Trả lời

25

Bạn không lưu trữ NSArray nguyên bản trong Dữ liệu chính. Bạn cần chuyển đổi các giá trị được lưu trữ trong phạm vi mảng thành Dữ liệu cốt lõi nào đó có thể sử dụng và sau đó lưu dữ liệu trong cửa hàng để bạn có thể đẩy và kéo dữ liệu đó đến số NSArray khi cần.

+10

Bình chọn không có bình luận? Không quá hữu ích đặc biệt vì câu trả lời không thực sự sai. –

+0

rằng dữ liệu lõi có thể sử dụng sẽ là một thực thể khác trong mô hình dữ liệu cốt lõi của bạn được kết nối với thực thể ban đầu của bạn thông qua mối quan hệ to-nhiều (giả sử tất cả các đối tượng NSArray của bạn cùng một lớp). –

+6

Câu hỏi là về * các thuộc tính có thể biến đổi *, là một cách hoàn toàn thích hợp để lưu trữ một NSArray hoặc đối tượng phức tạp khác trong Dữ liệu lõi. – quellish

7

Câu trả lời của Philip là đúng. Bạn không lưu trữ mảng trong Dữ liệu chính. Đó là hoàn toàn trái với những gì Core Dữ liệu được thực hiện cho. Hầu hết thời gian bạn không cần thông tin của mảng nhưng một và cái đó có thể được dữ liệu lõi tải động. Trong trường hợp các bộ sưu tập, nó không tạo ra sự khác biệt nếu bạn lặp qua một mảng thuộc tính bất kỳ của bạn hoặc của một mảng các kết quả được tìm nạp trên một số NSSet (về cơ bản cũng chỉ là một mảng).

Đây là lời giải thích những gì Philip nói. Bạn không thể lưu trữ một mảng trực tiếp, nhưng bạn có thể tạo một danh sách thuộc tính từ nó. Có một phương thức trong tất cả các Arraytypes của NS, cung cấp cho bạn chuỗi ký tự yêu thích và chuỗi dữ liệu cốt lõi và đẹp mắt. Điều thú vị về danh sách tài sản được lưu trữ dưới dạng chuỗi là, chúng có thể trở thành những gì chúng là. Có một phương pháp cho điều đó trong NSString. Tataaa ...

Có một mức giá tất nhiên. Mảng như danh sách tài sản có thể trở nên khổng lồ và điều đó không tốt với các thiết bị iOS có RAM bị giới hạn. Cố gắng lưu một mảng vào dữ liệu cốt lõi cho thấy thiết kế thực thể kém đặc biệt cho dữ liệu lớn. Một mảng nhỏ là OK vì lý do tốc độ.

Cách tiêu thụ không gian ít hơn, là sử dụng danh sách thuộc tính nhị phân. Những người đến gần với kích thước zip khi được lưu trữ trong Core Data hoặc trực tiếp trong hệ thống tập tin. Nhược điểm là, bạn không thể chỉ đơn giản là mở và đọc chúng như một tệp XML hoặc JSON. Đối với phát triển, tôi thích một cái gì đó con người có thể đọc được và phát hành phiên bản nhị phân. Một hằng số gắn với giá trị DEBUG trong bộ tiền xử lý sẽ xử lý điều đó, vì vậy tôi không phải thay đổi mã của mình.

+1

Xin vui lòng không giả định rằng các poster ban đầu bình chọn câu trả lời xuống, cho hương vị chua với một bài đã chua. Cảm ơn lời giải thích tốt đẹp mặc dù. – Stunner

+3

Ouch. Vâng, tôi đã làm sai lệch điều này và trả lời cảm xúc hơn. Tôi thực sự xin lỗi vì điều đó. –

1

Core lưu trữ các phiên bản của NSManagedObject hoặc các lớp con giống nhau. Bản thân NSManagedObject rất giống với một từ điển. Mối quan hệ nhiều giữa các đối tượng được biểu diễn dưới dạng tập hợp. Core Data không có danh sách thứ tự nào tương ứng với một mảng. Thay vào đó, khi bạn truy xuất các đối tượng từ một kho dữ liệu Core, bạn sử dụng một yêu cầu tìm nạp. Yêu cầu tìm nạp đó có thể chỉ định một hoặc nhiều bộ mô tả sắp xếp được sử dụng để sắp xếp các đối tượng và các đối tượng được trả về bởi một yêu cầu tìm nạp được lưu trữ trong một mảng.

Nếu bảo quản thứ tự của các đối tượng là quan trọng, bạn sẽ cần phải bao gồm một thuộc tính trong thực thể có thể được sử dụng để sắp xếp các đối tượng khi bạn tìm nạp chúng.

37

Nếu bạn thực sự cần thực hiện, hãy mã hóa dưới dạng dữ liệu. Tôi chỉ cần tạo một tệp mới có tên là receive làm NSData (Dữ liệu nhị phân).

Sau đó, trong việc thực hiện NSManagedObject:

-(void)setReceiveList:(NSArray*)list{ 
    self.receive = [NSKeyedArchiver archivedDataWithRootObject:list]; 
} 

-(NSArray*)getReceiveList{ 
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive]; 
} 
+0

Đúng, tốt hơn khi lưu trữ nó dưới dạng chuỗi –

+0

nhận xét hay để cho tôi gợi ý. – tounaobun

28

thuộc tính năng biến là cách chính xác để tồn tại các giá trị đối tượng khác không được hỗ trợ trong Core dữ liệu (chẳng hạn như NSArray).Từ Core Data Programming Guide: Non-Standard Persistent Attributes:

Ý tưởng đằng sau các thuộc tính năng biến là bạn truy cập vào một thuộc tính như một loại phi tiêu chuẩn, nhưng đằng sau hậu trường Core Data sử dụng một thể hiện của NSValueTransformer để chuyển đổi các thuộc tính đến và đi từ một thể hiện của NSData. Core Data sau đó lưu trữ cá thể dữ liệu vào kho lưu trữ liên tục.

Thuộc tính có thể biến đổi sử dụng NSValueTransformer để lưu trữ đối tượng không được hỗ trợ trong cửa hàng liên tục. Điều này cho phép Core Data lưu trữ bất kỳ thứ gì có thể được biểu diễn dưới dạng NSData - điều này có thể rất hữu ích. Thật không may, các thuộc tính biến đổi không thể được so khớp trong một vị từ hoặc được sử dụng trong các kết quả sắp xếp với NSSQLiteStoreType. Điều này có nghĩa là các thuộc tính có thể biến đổi chỉ hữu ích cho việc lưu trữ, không phải là phát hiện các đối tượng.

Biến áp mặc định cho phép bất kỳ đối tượng nào hỗ trợ NSCoding (hoặc NSSecureCoding) được lưu trữ dưới dạng thuộc tính có thể chuyển đổi. Điều này bao gồm NSArray, UIColor, UIImage, NSURL, CLLocation và nhiều thứ khác. Bạn không nên sử dụng dữ liệu này cho dữ liệu có thể tùy ý lớn, vì có thể có tác động hiệu suất đáng kể khi truy vấn cửa hàng. Hình ảnh, ví dụ, là một người nghèo phù hợp cho các thuộc tính biến đổi - chúng là những túi lớn các byte phân mảnh các cửa hàng. Trong trường hợp đó, tốt hơn nên sử dụng khả năng lưu trữ bản ghi bên ngoài của Dữ liệu cốt lõi hoặc để lưu trữ dữ liệu riêng biệt dưới dạng tệp và lưu trữ URL vào tệp trong Dữ liệu lõi. Nếu bạn phải lưu trữ UIImage trong Dữ liệu cốt lõi, hãy đảm bảo bạn biết các giao dịch có liên quan.

Tạo thuộc tính có thể biến đổi dễ dàng:

• Trong Trình chỉnh sửa mô hình dữ liệu cốt lõi của Xcode, hãy chọn thuộc tính mô hình bạn muốn sửa đổi. Trong thanh tra bên phải, hãy đặt loại thuộc tính là "Biến đổi". Bạn có thể để trống trường "Tên" để sử dụng biến áp mặc định. Nếu bạn đang sử dụng một biến tùy chỉnh, bạn sẽ nhập tên lớp ở đây và đăng ký lớp học bằng cách sử dụng +[NSValueTransformer setValueTransformer:forName:] ở đâu đó trong mã của bạn.

Core Data Model Editor Transformable Attribute

• Trong tiêu đề lớp con NSManagedObject bạn khai báo tài sản đó mô tả các thuộc tính năng biến với đúng loại. Trong trường hợp này, chúng tôi đang sử dụng NSArray:

@property (nonatomic, retain) NSArray *transformedArray;

• Trong tập tin thực hiện NSManagedObject lớp tài sản nên năng động:

@dynamic transformedArray;

Và bạn đã làm xong. Khi đối tượng giá trị NSArray được chuyển đến setTransformedArray: mảng đó được đối tượng giữ lại. Khi bối cảnh được lưu, dữ liệu cốt lõi sẽ biến đổi NSArray thành NSData bằng cách sử dụng NSValueTransformer được mô tả trong mô hình. NSData byte sẽ được lưu trong cửa hàng liên tục.

+0

Làm thế nào tôi có thể chuyển đổi một biến đổi (NSObject) thành NSArray? – Nil

+0

Quellish - câu trả lời tuyệt vời nhưng tôi có thể gặp khó khăn khi bạn mở rộng câu trả lời của bạn để bao gồm các khối mã như các đối tượng có thể biến đổi mà không cần chỉnh sửa các định nghĩa danh mục được tạo tự động mà XCode cung cấp từ mô hình không? Hầu như không có dữ liệu về điều này ở bất cứ đâu và, giống như người hỏi, tôi hoàn toàn mất đi cách để đạt được điều này. Cảm ơn trước nếu bạn không nhớ. – VectorVictor

+0

@VectorVictor Tôi không chắc chắn những gì bạn có ý nghĩa bởi các khối mã như các đối tượng biến đổi – quellish

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