无法将sqlite文件复制到用于iPhone的bundle / app资源中

时间:2012-06-06 09:24:51

标签: iphone sqlite resources copy bundle

我一直在为iPhone编写这个应用程序,我需要使用sqlite。我已经用一堆数据预加载了我的sqlite,我将该sqlite文件复制到我的项目文件夹中。当我启动应用程序时,似乎sqlite数据文件没有被复制到模拟器的应用程序文件(文档位置)。这是我的代码:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"moviedbl.data"];
    BOOL success = [fileManager fileExistsAtPath:dbPath];

    if(!success){
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"moviedbl.data"];
        //NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"moviedbl" ofType: @"data"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if(!success){
            NSAssert1(0, @"Failed to create writable database file with message '%'.", [error localizedDescription]);
        }
    }

似乎defaultDBPath引用了模拟器中的app文件夹,它最初不包含任何sqlite文件,而是实际上正在等待将sqlite文件复制到它。根据我的理解,要复制文件,我们应该从我们的包中获取文件(不确定bundle是指我们的项目文件夹还是什么,但我认为它是我们的项目文件夹)并将其复制到我们的模拟器中。我已经坚持了几天,请赐教我...非常感谢你提前!!!

更新: 所以我实际上让它工作了。起初我以为是因为我没有从mainBundle或其他东西复制文件,但事实证明,当我在路径中打开.app的实际文件夹时,我做了。我看到它实际包含的数据库。奇怪的是它没有文件类型,但在xCode中它将文件类型显示为“data”,因此我继续使用ofType:@“data”。所以最后我将它更改为ofType:@“”并且它有效!无论如何!愚蠢的我,但感谢所有试图帮助的人! :D

1 个答案:

答案 0 :(得分:1)

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];

NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"moviedbl.data"];

if([fileManager fileExistsAtPath:dbPath]==NO){

    NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"moviedbl" ofType: @"data"];
   BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

    if(!success){
        NSAssert1(0, @"Failed to create writable database file with message '%'.", [error localizedDescription]);
    }
}