2013-04-19 54 views

Trả lời

21

Nếu bạn muốn thay đổi các thuộc tính trong mô hình dữ liệu mã hiện tại của bạn thì bạn cần phải làm theo một số bước ... Xin vui lòng tham khảo này customizing-core-data-migrations

Hoặc này sẽ giúp bạn rất nhiều how-to-perform-a-lightweight-core-data-migration

+0

Nó đã giúp cảm ơn bạn! –

+12

Vui lòng tránh trả lời bằng URL hoặc ít nhất dán các điểm nổi bật trả lời câu hỏi. Bạn không thể đảm bảo liên kết bên ngoài sẽ luôn ở đó ... – dooleyo

+1

Và, trên thực tế, liên kết đầu tiên đã chết - Cổng xấu. – rattletrap99

4

Nếu bạn chỉ thêm thuộc tính vào một thực thể, bạn có thể sử dụng số tự động lightweight migration trong Dữ liệu chính.

Về cơ bản tất cả những gì bạn phải làm là chuyển một phiên bản NSDictionary bằng các tùy chọn thích hợp khi bạn thêm cửa hàng liên tục. Dưới đây là một đoạn mã từ ngày kết thúc của một phương pháp accessor cho _persistentStoreCoordinator:

NSNumber *optionYes = [NSNumber numberWithBool:YES]; 
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[optionYes] forKeys:@[NSMigratePersistentStoresAutomaticallyOption]]; 
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
    NSLog(@"Error opening persistent store: %@, %@", error, [error userInfo]); 
    abort(); 
} 
return _persistentStoreCoordinator; 

Nếu chuyển đổi của bạn là quá phức tạp đối với một sự chuyển đổi trọng lượng nhẹ, bạn sẽ thấy một lỗi. Nếu không, quá trình di chuyển sẽ chạy và cơ sở dữ liệu của bạn sẽ được cập nhật để phù hợp với lược đồ mới của bạn.

Lưu ý rằng nếu bạn đang thực hiện điều này cho thực trên thiết bị, bạn nên sao lưu tệp .sqlite trước tiên, trong trường hợp có sự cố khi di chuyển.

2

Vì vậy, vấn đề của tôi là tôi không biết mã điều phối cửa hàng liên tục này ở đâu. Nó chỉ ra nó được tự động tạo ra trong thực hiện AppDelegate của bạn khi bạn kiểm tra "Sử dụng dữ liệu cốt lõi" khi tạo dự án.

Vì vậy, từ liên kết thứ hai here, tất cả các bạn cần làm cho một sự chuyển đổi trọng lượng nhẹ (thêm thuộc tính mới và chào hàng) như sau:

  1. Chọn .xcdatamodeld bạn
  2. Từ menu , chọn Trình biên tập -> Thêm Mô hình Phiên bản
  3. Đặt tên phiên bản mới bất cứ điều gì bạn muốn, chọn phiên bản trước trong "Dựa trên mô hình"
  4. Trong Trình kiểm tra tệp .xcdatamodeld, chọn Phiên bản mẫu -> Hiện tại -> kiểu mới của bạn phiên bản
  5. Chọn phiên bản mô hình mới của bạn bên trong .xcdatamodeld trong Project Navigator và thực hiện thay đổi đối với mô hình
  6. Nếu bạn thay đổi tên hoặc loại thuộc tính, tạo mô hình ánh xạ, tệp mới -> Dữ liệu cốt lõi -> Mô hình ánh xạ -> chọn nguồn và mô hình điểm đến phiên bản
  7. cập nhật các bản đồ trong mô hình lập bản đồ mới

Thay đổi mã điều phối appdelegate cửa hàng khăng khăng của bạn như sau.

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("<data model name>.sqlite") 
    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    let options = [ 
    NSMigratePersistentStoresAutomaticallyOption: true, 
    NSInferMappingModelAutomaticallyOption: true] 
    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { 
     coordinator = nil 
     // Report any error we got. 
     var dict = [String: AnyObject]() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
     dict[NSUnderlyingErrorKey] = error 
     error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog("Unresolved error \(error), \(error!.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

Vì vậy, bạn chỉ thêm tùy chọn di chuyển vào cuộc gọi addPersistentStoreWithType.

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