2011-12-31 19 views
26

मैं iCloud मेरे ऐप है, जो, एक सर्वव्यापी दुकान के लिए एक मौजूदा स्थानीय दुकान विस्थापित करने के लिए करता है, तो उपयोगकर्ता यह अनुरोध करता है की जरूरत है के साथ काम करने के लिए कोशिश कर रहा हूँ के साथ एक मौजूदा कोर डाटा स्टोर।सिंक्रनाइज़ किए जा रहे iCloud

चारों ओर एप्पल देव मंचों कुछ नाउज़िंग और बाद कहीं और, मैं इस दृष्टिकोण है, जो लगातार काम नहीं कर रहा है ले लिया है। मैंने वास्तव में इसे काम देखा है, लेकिन डिवाइस बी पर कई क्रैश के बाद (जो iCloud से पॉप्युलेट किया गया है)।

- (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

बस एक नोट है कि ऐप में लगभग हमेशा एक ही स्टोर होता है; 2 स्टोर्स (ActiveStoreIndex, आदि) के मामले को संभालने के लिए कोड एक बढ़त मामला है। – ed94133

+1

माइग्रेटस्टोर कहां परिभाषित किया गया है और असाइन किया जा रहा है? – Jim

उत्तर

6

iCloud कोर डेटा सिंकिंग बहुत टूटा हुआ है। एक अधिक विश्वसनीय तृतीय-पक्ष समाधान TICoreDataSync है; this fork में iCloud पर समन्वयित करने के लिए समर्थन है, iCloud के कोर डेटा सिंक कार्यान्वयन पर भरोसा किए बिना। यह फ़ाइलों को सिंक करने के लिए बस iCloud का उपयोग करता है और कोर डेटा ऑब्जेक्ट को स्वयं समन्वयित करता है।

मैंने iCloud कोर डेटा सिंकिंग पर छोड़ दिया और इसके बजाय इस ऐप के साथ अपना ऐप बना रहा है; अब तक यह बहुत अच्छा काम कर रहा है, मैंने ऐप्पल के कार्यान्वयन के साथ किसी भी मुद्दे को देखा नहीं है।

+0

टीआईसीडीएस सक्रिय रूप से विकसित नहीं किया जा रहा है। मैंने एक ही सिद्धांत के आधार पर एक नया ढांचा विकसित किया, [एनसेम्बल] (http://ensembles.io), और टीआईसीडीएस के साथ सीखे गए पाठों के लिए लेखांकन। –

1

क्या आपने इसे काम किया?

नहीं तो यहाँ पूछने का प्रयास करें - Weird Errors using CoreData with iCloud

या अब कम से कम के लिए हाँ अगर :)

2

मैं iCloud एकीकरण पर छोड़ दिया हमें समाधान प्रदान करते हैं। मुझे नहीं लगता कि मैं अपने उपयोगकर्ताओं को iCloud के माध्यम से अनियमित कोर डेटा प्रदर्शन प्रदान करने के लिए एक विश्वसनीय सिंकिंग समाधान प्रदान कर सकता हूं। मैं आईओएस 5.1 के लिए आशा रख रहा हूँ।

+4

जिस कंपनी के लिए मैंने काम किया वह कोर डेटा के साथ मौजूदा ऐप में आईक्लाउड एकीकरण चाहता था, हालांकि मैंने उनसे कहा कि यह ठीक से काम नहीं करता है। यह नरक की तरह था !!! फरवरी में रिलीज होने के बाद हमें दुर्घटनाओं और खोए गए डेटा से संबंधित बहुत नकारात्मक प्रतिक्रिया मिली। अगस्त में कंपनी दिवालिया हो गई: डी बस कहानी बताना चाहता था ... –

संबंधित मुद्दे