作为我的应用启动的一部分,我将捆绑文件复制到我的文档目录。
这适用于我的四个文件中的三个,但第四个创建一个Zero KB文件。
在iOS 5.0 sim上运行。我已多次清理构建并检查文件名大写是否正确。
该文件出现在目录中,但是为零kb,应为24K
任何帮助表示感谢。
-(BOOL) CheckDBs: (NSString *)dbname
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath: dbPath];
NSLog(@"AppDelegate CheckDatabase: %@ = %i", dbPath, success);
if (success) {
//NSLog(@"return YES");
return YES;
}
else {
return NO;
}
} // Complete - checks if files exist in the User Documents directory
-(void) copyDBs: (NSString *) dbname
{
//Using NSFileManager we can perform many file system operations.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbPath = [documentsDir stringByAppendingPathComponent:dbname];
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname];
BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if (success) {
// Version 4.0 code
//NSDictionary *attribs = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
//success = [fileManager setAttributes:attribs ofItemAtPath:dbPath error:&error];
NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success);
}
//NSLog(@"AppDelegate copyDatase: %@ = %d", dbPath, success);
if (!success) {
NSLog(@"Failed to copy database: '%@'", [error localizedDescription]);
// NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
}
答案 0 :(得分:0)
您是否还检查了原始文件大小?
尝试重置模拟器。来自NSFileManager
文档:
如果dstPath上已存在同名文件,则此方法 中止复制尝试并返回适当的错误。
确保目的地为空,然后重试。另外,请检查error
对象。
如果所有检查结果都是拼写文件名时出错。检查确切的文件是否存在于bundle,NSLog中,只要您使用文件名或路径等。您应该找到错误。同时检查Finder中的相应文件夹。
而不是使用
[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbname]
尝试
[[NSBundle mainBundle] pathForResource:shortName ofType:@"db"]
答案 1 :(得分:0)
好的,我弄明白是什么导致了这个问题。
当我运行应用程序时,appdidfinishlaunching方法在其中一个视图控制器加载之前未完成。该视图控制器尝试访问从包中复制的其中一个文件。
我猜测sqlite在您尝试访问数据库时会创建该文件,它会创建一个零字节长度的文件。
因此,当我的appdidfinish启动方法检查由于sql调用而存在的文件存在时。
这通常只会在第一次运行应用程序之前出现问题,因为数据库将存在。
问题现在是如何让appdidfinish启动完成之前剩下的允许启动,因为有问题的视图控制器是mainwindow.xib的一部分