iOS 把数据库文件打包到mainbundle中,查找不到路径的解决办法

在开发中有时我们需要把数据库文件打包到我们的项目中,一般我们都是在外部用工具生成数据库文件,然后拉入项目中,但是我们在程序中查找改文件时,返回的路径总是nil

解决办法:

原因我们拉入其他资源文件(比如:图片、代码文件等)Xcode都会自动添加到target 的 "Build Phases" 下 "Copy Bundle Resources目录下,但是我们拉过来的数据库文件这里是找不到的,可能是Xcode无法识别这类文件(当我们拉去过来时),所以我们要做的就是把刚才添加的db文件加入该目录下,

这样就OK了,运行代码就可以找到了该数据库文件的路径了。接下来上代码:

- (void)_testdatabaseHandle { static NSString *const DATABASE_FILE_NAME = @"exiu.db"; NSString *dbFilePath ; 

//获取应用程序的路径

 NSArray *searchPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentFolderPath = [searchPaths objectAtIndex:0]; NSLog(@"docoumentFolderPath=%@",documentFolderPath); 

//往应用程序路径中添加数据库文件名称,把它们拼接起来, 这里用到了宏定义(目的是不易出错) 

dbFilePath = [documentFolderPath stringByAppendingPathComponent:DATABASE_FILE_NAME]; 

NSLog(@"dbFilePath = %@",dbFilePath); 

// /* 为什么要往应用程序里添加数据库文件这个过程: 因为下面要进行判断,会根据这个路径去查找应用程序的路径中到底有没有这个文件, 如果有,则不用在此拷贝了, 如果没有,则重新拷贝一次, 数据库文件必须添加进取,否则无法进行数据库的操作,而且必须添加一次, 那么为什么必须要添加一次呢? 因为我们在程序中实现对数据库的修改,然而却又把数据库添加了一次, 那么新添加的数据库就会把旧的数据库覆盖掉,那么程序中对数据库的修改也不能实现, 所以数据库只能添加一次且是在程序运行初添加 */ //根据上面拼接好的路径 dbFilePath ,利用NSFileManager 类的对象的fileExistsAtPath方法来检测是否存在,返回一个BOOL值 

//1. 创建NSFileManager对象 NSFileManager包含了文件属性的方法 

NSFileManager *fm = [NSFileManager defaultManager];

 //2. 通过 NSFileManager 对象 fm 来判断文件是否存在,存在 返回YES 不存在返回NO

BOOL isExist = [fm fileExistsAtPath:dbFilePath]; //- (BOOL)fileExistsAtPath:(NSString *)path; 

//如果不存在 isExist = NO,拷贝工程里的数据库到Documents下 if (!isExist) { //拷贝数据库 //获取工程里,数据库的路径,因为我们已在工程中添加了数据库文件,所以我们要从工程里获取路径 

NSString *backupDbPath = [[NSBundle mainBundle] pathForResource:@"exiu" ofType:@"db"]; 

//这一步实现数据库的添加, // 通过NSFileManager 对象的复制属性,把工程中数据库的路径拼接到应用程序的路径上 

BOOL cp = [fm copyItemAtPath:backupDbPath toPath:dbFilePath error:nil]; 

NSLog(@"cp = %d",cp); 

//- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NSLog(@"backupDbPath =%@",backupDbPath); if (cp) { NSError *error; //这里验证程序运行时,copy成功后,删除mainbundle里的文件 BOOL bl = [fm removeItemAtPath:backupDbPath error:&error]; } } NSLog(@"isExist =%d",isExist); }

下面说说copy文件成功后,删除main bundle下的源文件的可行性

如果是在模拟器下,你运行发现是可以的!这样并不意味着在真机上是可行的。经过真机测试,发现会报错!!因为程序在真机真机上运行时,bundle 是只读的!所以千万不要运行时修改程序bundle下的任何文件!!!

上面说到,程序运行时,程序bundle是只读的,这也是我们为什么要把数据文件copy到Document文件加下的原因!我们这个数据文件肯定是要进行增删改查操作的。

参考:http://stackoverflow.com/questions/21507028/ios-sqlite-db-path-from-nsbundle-mainbundle-returns-null

http://stackoverflow.com/questions/9002208/sqlite-db-path-in-bundle-acces

http://www.mindfiresolutions.com/Never-try-to-delete-any-resource-from-NSBundle-in-iPhoneiPadiPod-on-runtime-1523.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值