Coredata - 使用NSOpenPanel进行备份和还原

时间:2015-10-16 13:20:45

标签: objective-c macos core-data

OSX项目: 发生了一些奇怪的事情,希望有人对解决方案有所思考。我有一个coredata项目,我正在研究备份/恢复部分。

最初我对文件名进行了硬编码,并将应用程序文件目录用于存储位置 - 这一切都没有问题。

接下来,我使用NSOpenPanel选择存储位置。在这一步中,我在恢复过程中使用了相同的文件名 - 这没有问题。

最后,我使用NSOpenPanel选择要还原的文件 - 这就是问题所在。我收到错误,文件没有打开。

创建备用方法

  NSOpenPanel* openDlg = [NSOpenPanel openPanel];
  [openDlg setCanChooseFiles:NO];
  [openDlg setCanChooseDirectories:YES];
  [openDlg setAllowsMultipleSelection:NO];

  NSArray *pathName;
  if ( [openDlg runModal] == NSOKButton )
  {
    pathName = [openDlg URLs];

  }
  filePathNameBackup = [pathName objectAtIndex:0];

  NSDateFormatter *format = [[NSDateFormatter alloc]init];
  [format setDateFormat:@"yyyyMMddHHmmssSSS"];
  NSString *stringOfDate = [format stringFromDate:[NSDate date]];

  fileNameBackup = [fileNameBackup stringByAppendingString:stringOfDate];//fileNameBackup is defined earlier as "datafile"
  fileNameBackup = [fileNameBackup stringByAppendingString:@".backup"];
  //Created a filename with a timestamp

  filePathNameBackup = [filePathNameBackup    URLByAppendingPathComponent:fileNameBackup];

  NSURL *urlbackup = filePathNameBackup;

  ...then the rest of the code to save the file - which does work

然后在恢复方法中,我有以下内容:

  NSOpenPanel* openDlg = [NSOpenPanel openPanel];
  [openDlg setCanChooseFiles:YES];
  [openDlg setCanChooseDirectories:NO];
  [openDlg setAllowsMultipleSelection:NO];
  [openDlg setAllowedFileTypes:[NSArray arrayWithObject:@"backup"]];

  NSArray *pathName;
  if ( [openDlg runModal] == NSOKButton )
  {
     pathName = [openDlg URLs];

   NSURL *urlbackup = [pathname objectAtIndex:0];

  ... Then the rest of the restore method

以上不起作用,我在创建商店时收到错误 - 说明它无法打开文件。

  NSPersistentStore *restoreStore = [migrationCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:urlbackup options:nil error:nil];

现在有趣的疯狂部分是如果我使用创建备份方法中的文件路径名,它将起作用(filePathNameBackup):

 NSOpenPanel* openDlg = [NSOpenPanel openPanel];
  [openDlg setCanChooseFiles:YES];
  [openDlg setCanChooseDirectories:NO];
  [openDlg setAllowsMultipleSelection:NO];
  [openDlg setAllowedFileTypes:[NSArray arrayWithObject:@"backup"]];

  NSArray *pathName;
  if ( [openDlg runModal] == NSOKButton )
  {
     pathName = [openDlg URLs];

   NSURL *urlbackup = filePathNameBackup;

  ... Then the rest of the restore method

以上将有效。我打开应用程序,创建备份(在创建备份方法期间选择NSOpenPanel中的位置),更改文件,保存文件,恢复备份,一切正常!!

那么为什么使用NSOpenPanel来选择备份文件呢?

如果我NSLog的URL,它们看起来都是相同的。

恢复方法摘要:

 NSOpenPanel* openDlg = [NSOpenPanel openPanel];
  [openDlg setCanChooseFiles:YES];
  [openDlg setCanChooseDirectories:NO];
  [openDlg setAllowsMultipleSelection:NO];
  [openDlg setAllowedFileTypes:[NSArray arrayWithObject:@"backup"]];

  NSArray *pathName;
  if ( [openDlg runModal] == NSOKButton )
  {
     pathName = [openDlg URLs];


   NSURL *urlbackup = filePathNameBackup;    //THIS WORKS (Use filename created during backup)

   NSURL *urlbackup = [pathname objectAtIndex:0]; //THIS DOESNOT WORK

他们没有共同使用 - 我在运行程序之前先删除了一个或另一个urlbackup定义。

再次,为什么NSURL *urlbackup = [pathname objectAtIndex:0];不起作用?

任何想法都会很感激,我昨晚(今天早上)已经很晚了,准备扔东西了。它没有任何意义。

--- [EDIT ----- 收到的错误是错误:14,无法打开数据库文件

--- [编辑#2] ----

进行了几次测试,我认为它与沙盒有关 - 正如I00phole指出的那样,还不确定如何。如果我硬编码文件名并使用app目录,一切都很好。如果我硬编码另一个目录,它将无法正常工作。

我对沙盒并不是非常熟悉 - 任何建议都会受到赞赏。

0 个答案:

没有答案