2011-08-11 29 views
5

Tôi đã tìm thấy tài liệu rất hạn chế và giải pháp sự cố của tôi không có ở đâu.Phiên bản dữ liệu lõi và di chuyển với chính sách tùy chỉnh

Tôi cần thêm đối tượng mới (có quan hệ với tổ chức hiện tại). Đồng thời thêm và đổi tên một số thuộc tính của thực thể hiện có.

Lightweighted dụ:

Cũ mô hình có một thực thể Item với một thuộc tính name.

Trong mô hình mới, tôi muốn Item để có một thuộc tính mới dateAdded và đổi tên name thành title. Tại thời điểm này, nếu dateAdded sẽ là tùy chọn hoặc giá trị mặc định, tôi có thể sử dụng tính năng di chuyển nhẹ. Đúng nếu tôi đã sai lầm.

Nhưng tôi cũng muốn thêm thực thể List mới với thuộc tính title. Và thêm vào nhiều mối quan hệ. Danh sách có thể trống hoặc có nhiều mục. Mục phải tham khảo chính xác một danh sách.

Vì vậy, tôi bối rối về những gì tôi phải làm và thứ tự nào.

  1. Bật di chuyển với tính năng di chuyển có trọng lượng nhẹ bị tắt (NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil];).

  2. Tạo phiên bản mới của mô hình. Tôi có những thay đổi mà tôi muốn.

  3. Tạo mô hình ánh xạ mới. Nguồn là mô hình cũ, mục tiêu là mô hình mới. Trong ItemToItem Tôi đặt title thành $source.name.

Bên cạnh Xcode vẫn đang gặp sự cố khi làm việc với mô hình ánh xạ Tôi không biết phải làm gì tiếp theo. Tôi nghĩ rằng tôi phải tạo một ví dụ của List trong ngữ cảnh và làm cho tất cả các mục đề cập đến nó vì chính sách mối quan hệ. Và tôi nên sử dụng tùy chỉnh NSEntityMigrationPolicy để thực hiện việc này. Bất kỳ trợ giúp nào để thực hiện thử thách này?

Trả lời

9

Vâng, tôi đã làm ...

3 bước đầu tiên của tôi là chính xác. Tiếp tục kịch bản:

ADD4. Thực hiện ItemToItemMigrationPolicy, một lớp con của NSEntityMigrationPolicy. Ghi đè:

- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error 
{ 
    List* list = (List*)[NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:[manager destinationContext]]; 
    list.name = @"Default list"; 

    return YES; 
} 

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error 
{ 
    Item* item = (Item*)[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; 
    item.dateAdded = [NSDate date]; 
    task.title = [sInstance valueForKey:@"name"]; 

    [manager associateSourceInstance:sInstance withDestinationInstance:item forEntityMapping:mapping]; 

    return YES; 
} 

- (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error 
{ 

    NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"List"]; 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name LIKE 'Default list'"]; 
    fetchRequest.predicate = predicate; 

    NSError* fetchRequestError = nil; 
    NSArray* listsArray = [manager.destinationContext executeFetchRequest:fetchRequest error:&fetchRequestError]; 
    if (fetchRequestError) { 
     NSLog(@"%@", fetchRequestError.localizedDescription); 
    } 
    List* list = [listsArray lastObject]; 

    ((Item*)dInstance).list = list; 

    return YES; 
} 

ADD5. Trong Xcode trong mô hình ánh xạ, thiết lập chính sách di chuyển ItemToItem thành tùy chỉnh với giá trị ItemToItemMigrationPolicy.

ADD6. Tạo phiên bản mô hình mới của bạn và tạo các lớp (thay thế) từ các thực thể mới hoặc đã thay đổi.

ADD7. Thực hiện các thay đổi trong mã của bạn, ví dụ: item.name không còn hoạt động nữa. Bây giờ là item.title. Làm sạch dự án và chạy.

+0

Tại sao trọng lượng nhẹ cần phải được tắt cho nặng? Đó là làm việc cho tôi. Vì vậy, mã ước mơ của tôi là sai? !! – khunshan

1

Nếu bạn đang thêm một thực thể mới, thì bạn sẽ cần phải sử dụng một mô hình ánh xạ tùy chỉnh và tắt di chuyển nhẹ.

Một điều quan trọng. Khi làm việc với di chuyển, hãy đảm bảo bạn bắt đầu bằng một ví dụ mới về kho lưu trữ liên tục hiện có mỗi lần đặc biệt nếu bạn gặp sự cố. Nếu không, bạn có thể làm hỏng cửa hàng sẽ gây ra lỗi cho quả cầu tuyết.

+0

Tôi đang đi vào sáng kiến ​​di chuyển của mình. AFAIK, bạn có thể tránh các vấn đề về lưu trữ tham nhũng mà tôi kiểm tra và xóa cửa hàng tạm thời trước khi thử di chuyển. Điều này cũng sẽ đảm bảo ứng dụng của bạn không cố gắng di chuyển với một cửa hàng bị hỏng trong trường hợp di chuyển không can thiệp vào người dùng, mất điện, v.v. – stephen

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