将文件从捆绑包复制到无法正常工作的文档(Cocoa错误512)

时间:2011-10-29 21:25:52

标签: iphone ios cocoa-touch

我想简单地将我的sqlite3数据库复制到文档目录。我得到一个Cocoa Error 512,我想到的是,它不是一个有效的目录(或类似的东西。

数据库文件位于XCode的Resources文件夹中。 (文件名正确)

以下是我尝试使用的代码:

-(void) checkAndCreateDatabase
{
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];

    //databasePath + databaseName is declared in the header
    databaseName = @"WaypointDatabase.sql";
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    success = [fileManager fileExistsAtPath:databasePath];
if(success)
    {
        NSLog(@"Database exists");
            return;
    }
    else
        NSLog(@"Database does not exists");

    NSString *databasePathFromApp = [[NSBundle mainBundle] pathForResource:@"WaypointDatabase" ofType:@"sql"];
    if(databasePathFromApp == nil)
    {
        NSLog(@"ERROR: IT IS NIL");
    }
    NSError* error = nil;

    NSLog(@"Path in bundle:\n%@\n\n", databasePathFromApp);
    NSLog(@"Path to copy to:\n%@\n\n", databasePath);

    [fileManager copyItemAtPath:databasePathFromApp
                     toPath:databasePath error:&error];
    [fileManager release];
    if (error)
    {
        NSLog(@"%@\n\n", error);
        NSLog(@"%@", [error userInfo]);
    }
}

我得到的控制台输出是:

  

2011-10-30 10:36:13.242 xxxx [6726:707]数据库不存在
  2011-10-30 10:36:13.249 xxxx [6726:707]捆绑路径:
  /var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/xxxx.app/WaypointDatabase.sql

     

2011-10-30 10:36:13.252 xxxx [6726:707]复制到的路径:
  /var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents/WaypointDatabase.sql

     

2011-10-30 10:36:13.268 xxxx [6726:707]错误Domain = NSCocoaErrorDomain Code = 512“操作无法完成。(Cocoa错误512.)”UserInfo = 0xe8b7cd0 {NSUserStringVariant =(       复制   ),NSFilePath = / var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / xxxx.app / WaypointDatabase.sql,NSDestinationFilePath = / var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / Documents / WaypointDatabase.sql,NSUnderlyingError = 0xe8b7ee0“操作无法完成。不是目录”}

     

2011-10-30 10:36:13.272 xxxx [6726:707] {       NSDestinationFilePath =“/ var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / Files / WaypointDatabase.sql”;       NSFilePath =“/ var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / xxxxx.app / WaypointDatabase.sql”;       NSUnderlyingError =“错误域= NSPOSIXErrorDomain代码= 20 \”操作无法完成。不是目录\“”;       NSUserStringVariant =(           复制       );   }

我认为这必须与获取目录路径或其他东西有关,但现在已经停留了几天。

请注意,这完美无缺。模拟器上没有任何错误。

我哪里可能出错?

[UPDATE]

这可能是因为Documents - 文件夹目录不存在吗?我将如何创建/检查它?

[更新2]

我已经使用

完成了一些其他测试
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *err = nil;
NSArray *dirArr = [fileManager contentsOfDirectoryAtPath:documentsDir error:&err];
NSLog(@"~~Contents:\n%@",dirArr);
NSLog(@"~~Error: \n%@",err);

令人惊讶的是,它给了Cocoa Error 256并且还说“不是目录”。它几乎就像Documents directory does not exist. But it does, according to NSSearchPathForDirectoriesInDomains`

这是我得到的输出

  

2011-10-30 10:59:16.934 xxxx [6774:707] ~~内容:
  (空)
  2011-10-30 10:59:16.936 xxxx [6774:707] ~~错误:
  Error Domain = NSCocoaErrorDomain Code = 256“无法完成操作。(Cocoa error 256.)”UserInfo = 0x10052580 {NSUserStringVariant =(       夹   ),NSFilePath = / var / mobile / Applications / FF654016-4257-47BB-99FE-55DB5453BBC6 / Documents,NSUnderlyingError = 0x10054a50“操作无法完成。不是目录”}

2 个答案:

答案 0 :(得分:2)

通过在info.plist

中设置非标准Bundle ID解决了这个问题

我使用iTunes Connect中的Bundle ID来获取此特定应用。现在一切都很完美。

答案 1 :(得分:0)

尝试更改

[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

[[NSBundle mainBundle] pathForResource:@"WaypointDatabase" ofType:@"sql"];

并检查这不会返回nil以确保不会出现问题,除非它在第一次浏览时看起来不错。