2009-08-03 34 views
6

Tôi đã tạo tất cả đối tượng được quản lý của mình sau khi ánh xạ tất cả các thực thể/thuộc tính/mối quan hệ trong mô hình dữ liệu. Bây giờ tôi có vấn đề cần thêm các thuộc tính/mối quan hệ bổ sung mà tôi chưa từng nghĩ đến khi lần đầu tiên tôi thiết kế một trong các thực thể/lớp học của mình. Có cách nào để sửa đổi lớp NSManagedObject hiện tại của tôi với lõi dữ liệu ngắn của lau tất cả các mô hình của tôi và tái tạo chúng dựa trên xcdatamodel mới?Thêm thuộc tính vào thực thể trong Dữ liệu chính

Sẽ thêm thuộc tính trong bản cập nhật xcdatamodel cơ chế lưu trữ cơ bản? Nói rằng nếu tôi đang sử dụng SQLite3 như lưu trữ liên tục của tôi, nó sẽ thêm cột cho phù hợp?

Trả lời

8

Nếu bạn có nghĩa là "tôi có thể thay đổi xcdatamodel của mình và chỉ hợp nhất các thay đổi từ mã được tạo vào mã hiện tại của tôi cho các lớp dẫn xuất NSManagedObject," có, điều đó thật đơn giản. Bạn chỉ cần tạo mã cho các mô hình đã thay đổi rồi hợp nhất các thay đổi bằng tay vào các lớp có nguồn gốc cụ thể đó. Vì những thay đổi giống như chúng chỉ là các thuộc tính và mối quan hệ bổ sung nên điều này không quan trọng - thực tế, bạn có thể sử dụng diff và patch để thực hiện việc bán tự động này nếu thay đổi của bạn thực sự là phụ gia.

Tuy nhiên, nếu bạn có nghĩa là bạn cần phải di chuyển một cửa hàng hiện có sang một lược đồ mới, bạn có một số công việc phía trước bạn. Có một số điều kiện nhất định (thêm các thực thể trực giao, các thuộc tính đã tải xuống, v.v.) sẽ không buộc bạn phải làm điều này. Bạn sẽ nhận ra nếu bạn cần hay không khi bạn cố gắng thêm các cửa hàng liên tục hiện tại của bạn vào điều phối viên lưu trữ liên tục cho bối cảnh đối tượng được quản lý của bạn.

Trước khi quyết định bắt đầu thực hiện thay đổi lược đồ, bạn nên luôn đọc về cách thực hiện migrations and versioning trong Dữ liệu chính - nếu bạn có các cửa hàng hiện tại bạn cần giữ lại. Điều này gần như chắc chắn là trường hợp trong các ứng dụng có dữ liệu người dùng được lưu trữ trong các kho dữ liệu Core. Và trừ khi bạn có một công cụ nhập tự động hoặc tiện ích tạo lưu trữ dữ liệu, các kho lưu trữ tĩnh hiện tại của bạn cũng có khả năng cần di chuyển.

0

Bạn cũng nên xem phần thiết kế Thế hệ Gap. Nó sẽ giúp bạn trong chính xác tình trạng này. Here là một câu hỏi SO về việc sử dụng khoảng cách thế hệ với CoreData.

9

Khi con trỏ chỉ ra, thay đổi phức tạp cho mô hình dữ liệu của bạn, bạn cần phải tạo phiên bản mô hình và di chuyển dữ liệu theo mô hình cũ sang mô hình mới, theo hướng dẫn của Apple về vấn đề (mà anh ta liên kết tới) . Đừng lo lắng về bất kỳ SQL đằng sau hậu trường nào, Core Data xử lý điều đó cho bạn.

Tuy nhiên, đối với các thay đổi mô hình dữ liệu đơn giản, Apple đã giới thiệu một tính năng mới trong việc triển khai Dữ liệu lõi của iPhone OS 3.0 được gọi là lightweight migration. Để di chuyển ánh sáng, Core Data sẽ tự động di chuyển qua các thay đổi đơn giản trong mô hình dữ liệu của bạn, chẳng hạn như thay đổi tên của thuộc tính hoặc đối tượng, xóa thuộc tính, thêm thuộc tính với giá trị mặc định hoặc thay đổi kế thừa của thực thể. Bạn chỉ cần nhập vào số nhận dạng đổi tên trong phiên bản mới để trỏ đến tên của phiên bản cũ hơn, v.v. Dữ liệu cốt lõi sẽ xử lý các cập nhật dữ liệu của bạn một cách hiệu quả, miễn là bạn đặt các tùy chọn NSMigratePersistentStoresAutomaticallyOption và NSInferMappingModelAutomaticallyOption cửa hàng liên tục của bạn.

+2

Tôi đã tìm thấy [Di chuyển và phiên bản dữ liệu lõi] (http://www.timisted.net/blog/archive/core-data-migration/) khá rõ ràng lấp đầy chỗ trống trong tài liệu của Apple. 'Design> Data Model> Add Model Version' trong Xcode là bước tôi đã bỏ lỡ. –

+0

Xin lưu ý: Để có được giá trị mặc định được đặt cho các thuộc tính mới của các đối tượng hiện có, bạn sẽ phải bỏ chọn cờ "tùy chọn". Liên kết – Klaas

+0

@ShaunInman không khả dụng –

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