我想简单地将我的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.sql2011-10-30 10:36:13.252 xxxx [6726:707]复制到的路径:
/var/mobile/Applications/FF654016-4257-47BB-99FE-55DB5453BBC6/Documents/WaypointDatabase.sql2011-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“操作无法完成。不是目录”}
答案 0 :(得分:2)
通过在info.plist
中设置非标准Bundle ID解决了这个问题我使用iTunes Connect中的Bundle ID来获取此特定应用。现在一切都很完美。
答案 1 :(得分:0)
尝试更改
[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
的
[[NSBundle mainBundle] pathForResource:@"WaypointDatabase" ofType:@"sql"];
并检查这不会返回nil
以确保不会出现问题,除非它在第一次浏览时看起来不错。