我在“支持文件”文件夹中有我的数据库的副本。我需要更新几个表,并且尝试使用方法来制作db的可写副本。
- (void) createEditableDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *writableDB = [documentsDir stringByAppendingPathComponent:@"yc_ch.db"];
success = [fileManager fileExistsAtPath:writableDB];
NSString *defaultPath = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"yc_ch.db"];
success = [fileManager copyItemAtPath:defaultPath toPath:writableDB error:&error];
if (!success)
{
NSAssert1(0, @"Failed to create writable database file:'%@'.", [error localizedDescription]);
}
}
我已经在根目录中创建(键入)了“ Documents”文件夹。目前,文档的层次结构如下所示:
当我运行我的应用程序时。我正在获取NSAssert1(0,@“无法创建可写数据库文件:'%@'。”,[错误localizedDescription]);。
它出什么问题了?
最佳答案
即使文件已经存在于文档中,您也可以复制文件,我认为NSFileManager copyFileAtPath:如果目标位置已经存在文件,则将返回NO,因此无法通过检查并引发NSAssert
success = [fileManager fileExistsAtPath:writableDB];
if (success)
{
return;
}
因此,如果文档中已经存在该文件,则不会复制该文件。如果那是导致错误的原因,那么您是否可以实际发布断言,[error localizedDescription]至少会告诉您此刻出了什么问题。
编辑:
- (void) createEditableDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSString *writableDB = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"yc_ch.db"];
NSLog(@"Document path = %@", writableDB);
success = [fileManager fileExistsAtPath:writableDB];
if (success)
{
return;
}
NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"];
NSLog(@"defaultPath = %@", defaultPath);
error = nil;
success = [fileManager copyItemAtPath:defaultPath toPath:writableDB error:&error];
if (!success)
{
NSAssert1(0, @"Failed to create writable database file:%@", [error localizedDescription]);
}
if (error)
{
NSLog(@"error = %@", [error localizedDescription]);
}
}
关于objective-c - 尝试制作sqlite的可写副本时出现错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8904851/