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目录,一切都很好。如果我硬编码另一个目录,它将无法正常工作。
我对沙盒并不是非常熟悉 - 任何建议都会受到赞赏。