2011-12-31 22 views
26

Ben iCloud kullanıcı talep ettiğinde ise, her yerde bulunan bir mağazaya varolan yerel mağazayı taşınması gerekiyor benim app ile çalışmak için çalışıyorum ile varolan Çekirdek Veri deposu. Senkronizasyonu iCloud

bazı Apple dev forumlar etrafında nosing ve sonra başka bir yerde, ben sürekli çalışmıyor bu yaklaşımı, almış. Bunu gerçekten gördüm, ancak sadece B Aygıtında (iCloud'dan alınan) birkaç çökme sonrasında.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) 
    return persistentStoreCoordinator; 

    NSURL *legacyStoreUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:[self activeStoreFilenameUpgraded:NO]]]; 
    NSURL *upgradedStoreUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:[self activeStoreFilenameUpgraded:YES]]]; 

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

    if ((IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) && (self.iCloudEnabled)) { 
    NSPersistentStoreCoordinator* psc = persistentStoreCoordinator; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    NSDictionary *cloudOptions = nil; 
    NSDictionary *localOptions = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
            [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
            nil]; 


    NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<CONTAINER ID>"]; 
    NSString *coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:[NSString stringWithFormat:@"logs%d",[self activeStoreIndex]]]; 
    if ([coreDataCloudContent length] != 0) { 
     // iCloud is available 
     cloudURL = [NSURL fileURLWithPath:coreDataCloudContent]; 

     cloudOptions = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
         @"MyAppStore", NSPersistentStoreUbiquitousContentNameKey, 
         cloudURL, NSPersistentStoreUbiquitousContentURLKey, 
         nil]; 
    } else { 
     // iCloud is not available 
    } 

    NSError *error = nil; 
    [psc lock]; 
    if(migrateStore) { 
     migrateStore = NO; 

     NSPersistentStore *srcPS = [psc addPersistentStoreWithType:NSSQLiteStoreType 
      configuration:nil 
      URL:legacyStoreUrl 
      options:localOptions 
      error:&error]; 
     if (![psc migratePersistentStore:srcPS 
      toURL:upgradedStoreUrl 
      options:cloudOptions 
      withType:NSSQLiteStoreType 
      error:&error]) { 
      NSLog(@"Error migrating data: %@, %@/%@/%@", error, [error userInfo], legacyStoreUrl, upgradedStoreUrl); 
      abort(); 
     } 
    } 
    else { 
     if (![psc addPersistentStoreWithType:NSSQLiteStoreType 
      configuration:nil 
      URL:upgradedStoreUrl 
      options:(cloudOptions ? cloudOptions : localOptions) 
      error:&error]) { 
       NSLog(@"Unresolved iCloud error %@, %@", error, [error userInfo]); 
       abort(); 
     } 
    } 
    [psc unlock]; 

    [[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:legacyStoreUrl options:options error:&error]) { 
     // error 
     abort(); 
    }  
    } 

    return persistentStoreCoordinator; 
} 
+0

Uygulamanın hemen hemen her zaman yalnızca bir mağazasının bulunduğu bir not; 2 mağaza (activeStoreIndex, vb.) durumunun işlenmesi için kullanılan kod bir kenar durumdur. – ed94133

+1

migrateStore nerede tanımlanmış ve atanmış? – Jim

cevap

6

iCloud Core Veri senkronizasyonu çok bozuk. Daha güvenilir bir üçüncü taraf çözümü TICoreDataSync; this fork, iCloud'un Core Data Sync uygulamasına dayanmadan iCloud üzerinden senkronizasyon desteği sunar. Dosyaları senkronize etmek ve Core Data nesnesini kendi başına senkronize etmek için iCloud'u kullanır.

Ben iCloud Çekirdek Veri senkronizasyonu ve bunun yerine bu kütüphane ile benim uygulama oluşturmaya edilmiştir vazgeçti; Şimdiye kadar Apple'ın uygulaması ile gördüğüm sorunların hiçbiri, harika çalışıyor.

+0

TICDS aktif olarak geliştirilmiyor. Aynı ilkelere dayanarak yeni bir çerçeve geliştirdim, [Ensembles] (http://ensembles.io) ve TICDS ile öğrenilen derslerin muhasebesini yaptım. –

2

şimdi en azından için bize çözüm vermek -

değilse burada sormayı deneyin. Kullanıcılarıma, hatalı Çekirdek Verileri performansı düşünüldüğünde iCloud aracılığıyla güvenilir bir senkronizasyon çözümü sunabileceğimi hissetmiyorum. IOS 5.1 için umut bekliyorum.

+4

Çalıştığım şirket, düzgün bir şekilde çalışmadığını söylediğim halde, çekirdek verilerle mevcut bir uygulamada iCloud entegrasyonunu da istedi. Cehennem gibiydi! Şubat ayında piyasaya sürüldükten sonra, kazalar ve kayıp verilerle ilgili çok sayıda olumsuz geri bildirim aldık. Şirket Ağustos ayında iflas etti: D Sadece hikayeyi anlatmak istedim ... –

İlgili konular