2009-10-12 29 views
25

Tôi có một ứng dụng iPhone sử dụng Dữ liệu chính.Di chuyển dữ liệu lõi qua nhiều phiên bản nâng cấp

Tôi đã cập nhật và sử dụng Di chuyển nhẹ để chuyển từ V1 sang V2 của MOM (Mô hình đối tượng được quản lý). Điều này làm việc hoàn hảo.

Điều gì xảy ra khi tôi muốn chuyển sang V3 (và hơn thế nữa) của MOM?

  • Nếu tôi quyết định tiếp tục di chuyển nhẹ
  • Nếu tôi quyết định sử dụng mô hình ánh xạ, điều gì sẽ xảy ra? Làm thế nào để đối phó với việc nâng cấp cả V1 và V2 MOM lên V3? Tôi có cần tạo một mô hình ánh xạ cho cả V1 tới V3 và V2 tới V3 không?
  • Câu hỏi này đi xa hơn ... điều gì sẽ xảy ra khi tôi có V6 MOM và vẫn cần hỗ trợ khả năng nâng cấp từ V1 MOM?

Một câu hỏi khác là cách tốt nhất để xác định phiên bản của MOM hiện tại là gì? Tôi có nên sử dụng isConfiguration: compatibleWithStoreMetadata:

Cảm ơn bạn đã hỗ trợ. Tôi yêu dữ liệu cốt lõi. Nhưng đôi khi nó làm cho đầu của tôi quay và tôi trở nên bối rối, đó là lý do tại sao tôi đang tìm kiếm một số trí huệ.

Trả lời

2

Tôi đã di chuyển bình thường bằng cách sử dụng createDestinationInstancesForSourceInstance.
Đoạn mã cho biết cách ghi đè phương thức đó và cách lấy mã nguồn của mô hình để di chuyển. Việc di chuyển thực tế đang xảy ra trong lớp trợ giúp TZMigrationHelper.

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error 
{ 
    float sourceVersion = [[[mapping userInfo] valueForKey:@"sourceVersion"] floatValue]; 
    if(sourceVersion <= 0.9) 
    { 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"someProperty"]; 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"anotherProperty"]; 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"oneMoreProperty"];  
    } 
    return [super createDestinationInstancesForSourceInstance:sInstance entityMapping:mapping manager:manager error:error]; 
} 
+1

Từ xem xét kỹ hơn tài liệu Apple CoreDataVersioning.pdf, nó nói rằng quá trình di chuyển "Cố gắng tìm mô hình ánh xạ ánh xạ từ mô hình đối tượng được quản lý cho cửa hàng hiện tại đến cửa hàng đang sử dụng. " Điều này ngụ ý rằng tôi cần tạo một số lượng lớn các mô hình ánh xạ cho mỗi vòng quay của cơ sở dữ liệu của tôi. Vì vậy, đối với V3, tôi sẽ cần một mô hình ánh xạ V1 đến V3 cũng như mô hình ánh xạ V2 đến V3. Vì vậy, tôi bị nhầm lẫn bởi logic "rơi qua" của bạn và tại sao nó là cần thiết. – thevoid

+0

Bạn đã thử liệu có đủ để xác định nhiều mô hình để di chuyển qua nhiều phiên bản không? Tôi nghĩ rằng tôi sẽ loại bỏ phương pháp tiếp cận mùa thu ở trên vì tôi cũng không chắc chắn liệu nó có cần thiết hay không. –

7

Việc niêm yết ban đầu là bây giờ nhiều tháng trước đây, nhưng tôi nghĩ rằng câu trả lời tốt nhất được tìm thấy trong cuốn sách Core Data Marcus Zarra (hoặc trực tuyến trong các ví dụ code). Google cho "progressivelyMigrateURL" và một sẽ tìm mã để lặp đi lặp lại thông qua các mô hình - cho phép người dùng tạo ánh xạ từ mô hình n đến mô hình n + 1, trong khi không lo lắng về vụ nổ tổ hợp để tạo ánh xạ giữa tất cả các cặp mô hình.

Điều này có thể dẫn đến việc di chuyển chậm hơn khi chạy. Tôi đã không điều tra điều này.

+1

Nó chắc chắn là chậm hơn trong thời gian chạy hơn là có thể nhảy trực tiếp từ v1 đến v15. Tuy nhiên, thử nghiệm hiệu suất sẽ giúp xác định xem việc di chuyển tiến bộ của tôi có hoạt động hay không hoặc liệu bạn có cần thực hiện tất cả các bản đồ hay không. –

+0

Mã nguồn bằng phương pháp ProgressiveMigrateURL là từ sách Kệ sách thực dụng "Dữ liệu cốt lõi". Link là ở đây: http://pragprog.com/titles/mzcd/source_code – bentford

+0

Mã của Macrus Zarra rất tuyệt, và tôi rất khuyên bạn nên đọc cuốn sách của mình trên Core Data. Điều đó nói rằng, tôi phải thực hiện thay đổi sau để nó ngăn không cho nó đệ quy vô hạn nếu nó phát hiện ra các tệp '.mom' theo thứ tự sai: [gist.github.com/2321704](http://gist.github.com/2321704) (không có điều này, có một cơ hội nó sẽ tiếp tục cố gắng để di chuyển đến cùng một phiên bản nó đã có, mãi mãi.) –

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