2014-01-23 4 views
1

Я хочу проверить, есть ли данные в iCloud, если их нет, выложите на него новые данные и заполните его. если есть данные, там ничего не делать. также, если он может работать с версиями.iCloud, Core Data и дубликаты и как занести исходные данные?

У меня есть способ сделать это без включения iCloud, но я действительно хочу интегрировать iCloud в свое приложение. На данный момент я получаю дубликаты, когда когда-либо меняю версию приложения, потому что тогда он запускает код для нового управления версиями.

вот как я делаю это без iCloud.

Итак, мой вопрос: как проверить, есть ли какие-либо данные в iCloud, и если это никогда не будет использовано. если он старше, перезапишите его или что-то в этом роде. просто способ засеять мои данные, когда когда-либо делаю изменения в plist в hovedmenu и использую это.

FYI Я использованияКонтактная MagicalRecord, но я могу и правильно будет использовать стандартный код ядра данных для заполнения для его

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

if (![userDefaults valueForKey:@"version"]) 
{ 
    [Hovedmenu MR_truncateAll]; 
    [self hovedMenu]; 
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 

    NSLog(@"running code"); 

    // Adding version number to NSUserDefaults for first version: 
    [userDefaults setFloat:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue] forKey:@"version"]; 
} 

if ([[NSUserDefaults standardUserDefaults] floatForKey:@"version"] == [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue]) 
{ 
    /// Same Version so dont run the function 
} 
else 
{ 
    [Hovedmenu MR_truncateAll]; 

    [self hovedMenu]; 

    NSLog(@"running code agian"); 
    [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 

    // Update version number to NSUserDefaults for other versions: 
    [userDefaults setFloat:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue] forKey:@"version"]; 
} 

NSLog(@"%@", [NSString stringWithFormat:@"Version %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]); 

-(void)hovedMenu{ 
NSManagedObjectModel *mom = [NSManagedObjectModel MR_defaultManagedObjectModel]; 
NSDictionary *attrs = [[[mom entitiesByName] objectForKey:@"Hovedmenu"] attributesByName]; 
NSArray *keyedValues = [[NSArray alloc] initWithContentsOfFile: 
         [[NSBundle mainBundle] pathForResource:@"hovedMenu" ofType:@"plist"] 
         ]; 

for(NSDictionary *keyedValueDict in keyedValues) { 
    NSManagedObject *mObj = [NSEntityDescription insertNewObjectForEntityForName:@"Hovedmenu" inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]]; 
    for (NSString *attribute in attrs) { 
     id value = [keyedValueDict objectForKey:attribute]; 
     if (value == nil) { 
      // Don't attempt to set nil, or you'll overwite values in self that aren't present in keyedValues 
      continue; 
     } 
     NSAttributeType attributeType = [[attrs objectForKey:attribute] attributeType]; 
     if ((attributeType == NSStringAttributeType) && ([value isKindOfClass:[NSNumber class]])) { 
      value = [value stringValue]; 
     } else if (((attributeType == NSInteger16AttributeType) || (attributeType == NSInteger32AttributeType) || (attributeType == NSInteger64AttributeType) || (attributeType == NSBooleanAttributeType)) && ([value isKindOfClass:[NSString class]])) { 
      value = [NSNumber numberWithInteger:[value integerValue]]; 
     } else if ((attributeType == NSFloatAttributeType) && ([value isKindOfClass:[NSString class]])) { 
      value = [NSNumber numberWithDouble:[value doubleValue]]; 
     } 
     [mObj setValue:value forKey:attribute]; 
     NSLog(@"Value %@ for Key %@", value, attribute); 
    } 

} 
} 
+0

Взгляните на примеры здесь. Я отправил пример приложения, которое сначала проверяет, существует ли документ iCloud при инициализации нового хранилища на устройстве. http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/ –

+0

Проверка iCloud выполняется путем поиска каталог с тем же именем, что и 'NSPersistentStoreUbiquityNameKey' в каталоге контейнеров iCloud'/CoreData'. Эта проверка не будет работать, если устройство не войдет в iCloud или не имеет доступа к сети, поскольку другое устройство создало хранилище в iCloud. –

ответ

0

Проверьте это видео с WWDC 2012 Using iCloud with Core Data. Они также объясняют, как делать именно то, что вы хотите, и указывать на другие материалы об iCloud.

Смежные вопросы