2012-04-26 39 views
6

Tôi đang sử dụng Dữ liệu cốt lõi trong một ứng dụng hiện có. Bây giờ tôi muốn tích hợp iCloud để người dùng có thể đồng bộ hóa nội dung giữa các thiết bị iOS của họ. Để làm được điều mà tôi đã viết đoạn code sau cho NSPersistentStoreCoordinator tôi (dĩ nhiên là placeholders được điền trong mã của tôi):iOS: Di chuyển cơ sở dữ liệu lõi dữ liệu hiện có vào iCloud

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

if (persistentStoreCoordinator_ != nil) { 
    return persistentStoreCoordinator_; 
} 

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<DB_Name>.sqlite"]; 

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

NSPersistentStoreCoordinator* psc = persistentStoreCoordinator_; 

if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 

     // Migrate datamodel 
     NSDictionary *options = nil; 

     // this needs to match the entitlements and provisioning profile 
     NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<App_Identifier>"]; 
     NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"]; 
     if ([coreDataCloudContent length] != 0) { 
      // iCloud is available 
      cloudURL = [NSURL fileURLWithPath:coreDataCloudContent]; 

      options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
         @"<App_Name>.store", NSPersistentStoreUbiquitousContentNameKey, 
         cloudURL, NSPersistentStoreUbiquitousContentURLKey, 
         nil]; 
     } else { 
      // iCloud is not available 
      options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
         nil]; 
     } 

     NSError *error = nil; 
     [psc lock]; 
     if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
     { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     } 
     [psc unlock]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"asynchronously added persistent store!"); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil]; 
     }); 

    }); 

} else { 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 

    NSError *error = nil; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 
} 

return persistentStoreCoordinator_; 
} 

Với mã tất cả thêm bản ghi dữ liệu mới được đồng bộ hóa tự động giữa tất cả iOS- các thiết bị, do đó hoạt động chính xác theo cách của nó!

Nhưng điều tôi muốn cũng là tất cả các bản ghi dữ liệu hiện có được đồng bộ hóa giữa tất cả các thiết bị; vẫn chưa hoạt động. Các bản ghi hiện có vẫn có sẵn trong ứng dụng và có thể được sử dụng, nhưng chúng không được đồng bộ hóa.

Tôi cần phải làm gì để có được tất cả các bản ghi dữ liệu hiện có được đồng bộ hóa với iCloud? Tôi đã thử nghiệm một chút với phương pháp

migratePersistentStore:toURL:options:withType:error: 

nhưng không thành công.

Tôi rất biết ơn vì bất kỳ trợ giúp nào!

+0

Bạn cần một số mã đặc biệt để di chuyển dữ liệu hiện có. Google xung quanh - đã có giải pháp rồi. Bạn cũng có thể xem chủ đề này trên diễn đàn của Apple Developer - https://devforums.apple.com/thread/126670?tstart=0 bạn phải có một id nhà phát triển hợp lệ để truy cập nó. Nhìn vào cuối của sợi đầu tiên (nó khá dài). –

Trả lời

1

Tra cứu phiên WWDC 2012 Sử dụng CoreData với iCloud. Họ thảo luận vấn đề này trong phần cuối cùng, dưới chủ đề gieo hạt. Họ cũng có một số mã mẫu mà bạn có thể lấy từ trang web có ví dụ. Trong ngắn hạn, bạn sẽ phải mở 2 cửa hàng liên tục, thiết lập kích thước tìm nạp, sau đó lấy lô từ nguồn, lặp qua chúng và thêm chúng vào cửa hàng mới và khoảng thời gian kích thước hàng loạt, lưu và đặt lại. Khá đơn giản.

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