2014-02-08 58 views
0

我试着去创造核心数据UIManagedDocument备份,并将它们存储在iCloud中。它已经> 2个月,因为我试图做到这一点,我不明白如何做到这一点。有在互联网上没有任何信息在所有... 我尝试至少创建本地备份和它不工作,要么 这是代码:UImanagedDocument的persistentStore iCloud云备份

-(void)testCopyStoreToDocuments 
{ 
    AppDelegate* appDelegate=(AppDelegate*)[UIApplication sharedApplication].delegate; 
    [appDelegate.userDataDocument closeWithCompletionHandler:^(BOOL closed) 
    { 
     if(closed) 
     { 
      @autoreleasepool { 
       NSFileCoordinator *fc = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
       NSString *sourceFile = [[[[LoadingManager localDocumentURL]URLByAppendingPathComponent:@"StoreContent"]path] stringByAppendingPathComponent:@"persistentStore"]; 
       NSURL *sourceURL = [NSURL fileURLWithPath:sourceFile]; 

       [fc coordinateReadingItemAtURL:sourceURL options:NSFileCoordinatorReadingWithoutChanges error:nil byAccessor:^(NSURL *sourceURLtoUse) { 
        NSError *error = nil; 
        NSFileManager *fm = [[NSFileManager alloc] init]; 
        NSString *destinationFile = [[[LoadingManager localDocumentsDirectoryURL]path] stringByAppendingPathComponent:@"persistentStore"]; 


        //simply copy the file over 
        BOOL copySuccess = [fm copyItemAtPath:[sourceURLtoUse path] 
                toPath:destinationFile 
                error:&error]; 
        if (copySuccess) { 
         NSLog(@" copied file successfully"); 
        } else { 
         NSLog(@"Error copying item at path: %@\nTo path: %@\nError: %@", sourceFile, destinationFile, error); 
        } 
       }]; 
       fc = nil; 
      } 

     } 
    }]; 
} 
-(void)testReplaceStore 
{ 
    AppDelegate* appDelegate=(AppDelegate*)[UIApplication sharedApplication].delegate; 
    [appDelegate.userDataDocument closeWithCompletionHandler:^(BOOL closed) 
    { 
     if(closed) 
     { 
      NSFileCoordinator *fc = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
      [fc coordinateWritingItemAtURL:[[[LoadingManager localDocumentURL]URLByAppendingPathComponent:@"StoreContent"]URLByAppendingPathComponent:@"persistentStore"] options:NSFileCoordinatorWritingForDeleting error:nil byAccessor:^(NSURL *sourceURLtoUse){ 
       NSLog(@"%@",sourceURLtoUse); 
       NSError * error = nil; 
       NSLog(@"replacment: %hhd",[[NSFileManager defaultManager]replaceItemAtURL:sourceURLtoUse withItemAtURL:[[LoadingManager localDocumentsDirectoryURL]URLByAppendingPathComponent:@"persistentStore"] backupItemName:@"backUp" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&error]); 
       NSLog(@"%@",error); 
      }]; 
      NSLog(@"stores: %@",appDelegate.userDataDocument.managedObjectContext.persistentStoreCoordinator.persistentStores); 
      [appDelegate.userDataDocument saveToURL:appDelegate.userDataDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL saved) 
       { 
        if(saved) 
        { 
         [appDelegate.userDataDocument openWithCompletionHandler:^(BOOL opened) 
         { 
          if(opened) 
          { 
           NSLog(@"opened"); 
          } 

         }]; 
        } 
        else 
        { 
         NSLog(@"failed to save"); 
         NSLog(@"stores: %@",appDelegate.userDataDocument.managedObjectContext.persistentStoreCoordinator.persistentStores); 
        } 
       }]; 
     } 
    }]; 
} 

它Nslogs错误时更换正所谓:

replacment: 0 
Error Domain=NSCocoaErrorDomain Code=512 "The operation couldn’t be completed. (Cocoa error 512.)" UserInfo=0x15d91540 {NSFileNewItemLocationKey=file:///var/mobile/Applications/85974C93-75FD-406A-B1BF-EDE7DFC25FE2/Documents/persistentStore, NSFileOriginalItemLocationKey=file:///var/mobile/Applications/85974C93-75FD-406A-B1BF-EDE7DFC25FE2/Documents/Data%20Document/StoreContent/persistentStore, NSUnderlyingError=0x15db0080 "The operation couldn’t be completed. (Cocoa error 260.)", 
+0

这将有助于,如果你描述了你遇到的问题与上面的代码。 –

+0

@TomHarrington ive已更新问题 – t0a0

+0

该文件是否已经存在?检查目标文件是否已经存在,并在复制之前删除它!顺便说一句 –

回答

0

我刚刚测试此代码,它工作正常。这里是一个示例应用程序http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

如果目标文件已经存在,你会得到错误。

/** Copies file to iCloud container removing the target file if it already exists 

@param docURL URL of UIManagedDocument whose store file is to be copied (its Core Data Store must not be shared in iCloud! 
*/ 
- (void)copyFileToICloud:(NSURL*)docURL { 
    @autoreleasepool { 
     NSFileCoordinator *fc = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
     NSURL *sourceURL = [[docURL URLByAppendingPathComponent:@"StoreContent"] URLByAppendingPathComponent:@"persistentStore"]; 

     // Local directory - test 
     //NSString *destinationFile = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"persistentStore_backup"]; 

     NSURL *destinationURL = [[[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:@"persistentStore_backup"]; 


     FLOG(@" source file is %@", sourceURL); 
     FLOG(@" target file is %@", destinationURL); 

     NSError *cError; 

     [fc coordinateWritingItemAtURL:destinationURL options:NSFileCoordinatorWritingForReplacing error:&cError byAccessor:^(NSURL *newURL) { 
      NSError *error = nil; 
      NSFileManager *fm = [[NSFileManager alloc] init]; 

      // Delete it if it already exists 
      if ([fm fileExistsAtPath:[newURL path]]) { 
       FLOG(@" target file exists"); 
       if (![fm removeItemAtURL:newURL error:&error]) { 
        FLOG(@" error unable to remove target file"); 
        NSLog(@"Error removing item Error: %@, %@", error, error.userInfo); 
        return; 
       } else { 
        FLOG(@" target file removed"); 
       } 
      } 

      //simply copy the file over 
      BOOL copySuccess = [fm copyItemAtPath:[sourceURL path] 
              toPath:[newURL path] 
              error:&error]; 
      if (copySuccess) { 
       NSLog(@" copied file successfully"); 
      } else { 
       NSLog(@"Error copying items Error: %@, %@", error, error.userInfo); 
      } 
     }]; 

     if (cError) { 
      FLOG(@" error is %@", cError); 
     } 

     fc = nil; 
    } 
} 

编辑:一些额外的事情要记住:

  • 如果您正在使用WAL模式(或默认核心数据模式iOS7,Mac OS X 10.9),那么你必须复制〜 wal和〜shm文件 - 更好地复制整个StoreContent目录。

  • 要从iCloud复制文件,您必须执行元数据查询以查找文件,然后检查下载状态,我认为您必须触发下载并检查文件是否已下载,然后才能复制它们。