尝试从bundle复制到文档目录时出错

Har*_*nan 2 objective-c nsfilemanager nsbundle ios

我已将sqlite文件添加到我的应用程序中,并尝试将其从包中复制到文档目录.我也将sqlite添加到目标应用程序中.以下是我用来复制文件的代码:

NSString *destination = [[[Utils applicationDocumentsDirectory] absoluteString] stringByAppendingString:@"myapp.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:destination]) {
        NSString *source = [[NSBundle mainBundle] pathForResource:@"myapp" ofType:@"sqlite"];
        NSError *error = nil;
        [fileManager copyItemAtPath:source toPath:destination error:&error];
        if (error) {
            //
        }
    }
Run Code Online (Sandbox Code Playgroud)

代码[Utils applicationDocumentsDirectory]:

+ (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Run Code Online (Sandbox Code Playgroud)

但是当执行此代码时,我得到以下内容error:

错误域= NSCocoaErrorDomain代码= 4"文件"myapp.sqlite"不存在." 的UserInfo = {NSSourceFilePathErrorKey = /用户/ harikrishnant /库/开发商/ CoreSimulator /设备/ 8E531314-F1AE-417F-8E99-7AA92967CDC9 /数据/容器/捆绑/应用/ 0A710929-475D-457C-8D2D-C2F2BBEB6B92/myapp.app/myapp.sqlite,NSUserStringVariant =(Copy),NSDestinationFilePath = file:/// Users/harikrishnant/Library/Developer/CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data/Containers/Data/Application/13B22E15-D00C -433C-9F02-014B1F73D183/Documents/myapp.sqlite,NSFilePath =/Users/harikrishnant/Library/Developer/CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data/Containers/Bundle/Application/0A710929-475D- 457C-8D2D-C2F2BBEB6B92/myapp.app/myapp.sqlite,NSUnderlyingError = 0x7faffe1b5cf0 {Error Domain = NSPOSIXErrorDomain Code = 2"No such file or directory"}}

我使用终端检查了以下路径,并发现应用程序包中实际存在sqlite文件:

/Users/harikrishnant/Library/Developer/CoreSimulator/Devices/8E531314-F1AE-417F-8E99-7AA92967CDC9/data/Containers/Bundle/Application/0A710929-475D-457C-8D2D-C2F2BBEB6B92/myapp.app/myapp.sqlite

但我仍然得到这个错误.我尝试了一切.我甚至清理了构建文件夹并重新安装了应用程序,它仍然无法正常工作.这可能是什么问题?怎么解决?

rma*_*ddy 5

你的代码几乎是正确的.这条线有两个缺点:

NSString *destination = [[[Utils applicationDocumentsDirectory] absoluteString] stringByAppendingString:@"myapp.sqlite"];
Run Code Online (Sandbox Code Playgroud)

使用absoluteString不正确.这会在表单中提供文件URL file://path/to/Documents/.您需要使用该path方法从中获取文件路径(而不是文件URL)NSURL.

然后,您需要将文件名正确附加到路径.你需要使用stringByAppendingPathComponent:而不是stringByAppendingString:.

该行应该是:

NSString *destination = [[[Utils applicationDocumentsDirectory] path] stringByAppendingPathComponent:@"myapp.sqlite"];
Run Code Online (Sandbox Code Playgroud)