2012-03-05 15 views
19

Tôi đã tìm kiếm một bài viết giải thích các lợi thế và nhược điểm của NSCoding (NSKeyedArchiver ...) về việc sử dụng CoreData (SQLite ....).NSCoding VS Dữ liệu cốt lõi

Có rất nhiều tùy chọn, tôi có thể triển khai trình đọc/ghi nhị phân tùy chỉnh của riêng mình hoặc sử dụng plists/xml/json ... hoặc sử dụng SQLite hoặc NSCoding.

Tôi sắp bị lạc mất. Bất kỳ cơ thể nào có thể giải thích sự khác biệt giữa các tính năng CHÍNH?

+2

Các bản sao có thể có: http://stackoverflow.com/questions/4989609 http://stackoverflow.com/questions/840634 –

+2

điều là sqlite được coi là bên trong coredata. Và liên kết đầu tiên bạn đề xuất, nói về cụ thể sqlite3 vs nscoding; không có nhiều câu trả lời. Tôi đang hỏi một câu hỏi tổng quát hơn. Tại sao có quá nhiều tùy chọn để xử lý dữ liệu. – LolaRun

Trả lời

30

Tùy thuộc vào loại dữ liệu bạn muốn lưu và bạn chỉ sử dụng dữ liệu đó trong nội bộ hay bạn phải trao đổi dữ liệu với dịch vụ bên ngoài.

NSCoding thường nói trình nối tiếp dữ liệu. Rất nhiều đối tượng dựng sẵn thực hiện giao thức NSCoder cho phép bạn lưu chúng dưới dạng luồng nhị phân (tệp, trong BLOB của sqlite, v.v.) NSKeyedArchiver cung cấp cho bạn dấu cộng trong tìm kiếm trong các luồng dựa trên nhãn chuỗi , giống như một từ điển nhưng bạn chỉ có thể sử dụng các chuỗi làm khóa. Cách tiếp cận này là tốt nếu bạn thỉnh thoảng phải tồn tại một số đối tượng của các lớp khác nhau.

Tuy nhiên, nếu bạn có nhiều đối tượng của cùng một lớp, bạn sẽ tốt hơn đi tiếp cận cơ sở dữ liệu, SQLite hoặc CoreData. CoreData thực tế là một trình bao bọc xung quanh SQLite giúp giảm bớt rất nhiều thiết kế mô hình dữ liệu của bạn và thực hiện các truy vấn tới DB phía sau màn cửa mà không cần phải viết các câu lệnh SQL. Trong CoreData bạn định nghĩa các lớp của bạn, và mỗi thể hiện của lớp có thể được duy trì, tức là bạn có thể lấy lại các giá trị của các thành viên của đối tượng mà không cần chúng luôn trong bộ nhớ. Đây là một cách rất thuận tiện để lưu trữ rất nhiều dữ liệu có cấu trúc. Ví dụ: nếu bạn viết trình duyệt web, bạn có thể lưu trữ dấu trang của người dùng bằng tên, URL và có thể là lần truy cập cuối cùng.

Đối với XML và JSON, không có lợi thế cụ thể nào nếu bạn chỉ sử dụng dữ liệu cục bộ cho thiết bị. Nếu bạn phải giao tiếp với một số dịch vụ bên ngoài, bạn có thể xem xét lưu vào bộ nhớ cache/lưu các đối tượng XML/JSON khi chúng được sử dụng sau này. Cách tiếp cận khác sẽ là tạo lại dữ liệu này từ các cấu trúc dữ liệu nội bộ của bạn (xem ở trên) mỗi lần bạn cần nó.

Nếu bạn tự mình thiết kế mô hình dữ liệu của mình, tôi sẽ thấy ít điểm hơn để sử dụng các cuộn dây, nhưng có thể ai đó sẽ sửa tôi.

EDIT: Tôi thêm vào đây một tham chiếu liên kết ngắn để biết hướng dẫn về cách sử dụng NSCoding, Core Data và làm tiền thưởng, SQLite.

CẬP NHẬT 12.01.2016: Nếu bạn đang tìm giải pháp kiên trì, tôi khuyên bạn cũng nên xem Realm.

+0

nếu các tệp blob của một sqlite được tuần tự hóa, điều đó có nghĩa là việc tuần tự hóa là tốt nhất để thu được các khối dữ liệu nhị phân nhỏ nhất. Bạn cũng có thể sử dụng NSCoding cho conditionalObjectEncodings, loại bỏ sự trùng lặp của các cá thể đối tượng còn sống trong bộ nhớ. Lý do tôi hỏi câu hỏi này, là bởi vì mọi người nói và đề nghị Coredata-SQLite, nhưng tôi không thấy lợi thế đó Trừ khi xây dựng dựa trên nguồn dữ liệu khổng lồ, và bạn không thể đặt tất cả những gì trong bộ nhớ. Tôi có đúng không? – LolaRun

+2

Luôn có sự cân bằng giữa bộ nhớ và tối ưu hóa hiệu suất. Với NSCoding, hoặc biểu diễn nhị phân tùy chỉnh của bạn, bạn có nhiều quyền kiểm soát hơn đối với các bit được ghi vào bộ nhớ hoặc được lưu trữ trong bộ nhớ, nhưng đối với điều này, bạn phải trả giá mã hóa nhiều hơn, do đó hiệu quả của mã sẽ phụ thuộc vào khả năng. Với CoreData/SQLite, rất nhiều thứ hữu ích được thực hiện cho bạn một cách hiệu quả (tìm kiếm, truy vấn, lập chỉ mục, tham gia, v.v.). Lưu ý: Các đối tượng CoreData được nạp vào bộ nhớ chỉ khi cần thiết, nếu không chúng sẽ nằm trong db. – MrTJ

+0

Tuyệt vời. Vì vậy, nếu tôi đang sử dụng mẫu ứng dụng "ApplicationDocument" và nếu tôi cần lưu và mở tài liệu, tôi sẽ không thực sự cần các lợi ích của CoreData, vì tôi cần tải mọi thứ trong bộ nhớ và không cần truy vấn và ... các chức năng cơ sở dữ liệu. Sự khác biệt chính là chi phí phát triển. Mà trong trường hợp của tôi không phải là một trở ngại. Cảm ơn rất nhiều. Tôi sẽ đợi một chút, để thu hút thêm câu trả lời và thảo luận thêm, trước khi chấp nhận câu trả lời – LolaRun

3

Luôn có trở kháng giữa các đối tượng và cấu trúc quan hệ. Tôi luôn thích các đối tượng hơn vì truy cập dữ liệu thường là một phần chức năng trong ứng dụng của bạn. Với NSCoding, bạn có được sự đơn giản, dễ dàng gỡ lỗi và kiểm soát với rất ít mã để viết anyways. Bạn cũng có thể linh hoạt kết hợp NSCoding vào các cấu trúc cơ sở dữ liệu của bạn.

NSCoding là cơ chế lưu giữ lâu bền đối tượng. Nếu bạn thêm các chỉ mục vào các cấu trúc quan hệ của bạn để tối ưu hóa tìm kiếm và duy trì các cấu trúc đối tượng, thì tôi nghĩ bạn sẽ có được tốt nhất của tất cả các thế giới với chi phí rất thấp và dễ bảo trì.

8

Mattt Thompson cung cấp phân tích tiêu hóa những khác biệt khác nhau giữa NSCoding, dữ liệu Core, và NSKeyedArchiver trên NSHipster: http://nshipster.com/nscoding/

+1

cảm ơn bạn, đây là một lời giải thích rõ ràng. – LolaRun

2

Để thêm vào đã câu trả lời tuyệt vời, NSCoding cùng với NSKeyedArchiver là một cách tuyệt vời để lưu trữ dữ liệu mà là quá lớn (hoặc loại dữ liệu không tương thích) cho NSUserDefaults nhưng quá nhỏ và không nhiều cho CoreData.