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

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

  1. iOS 把数据库文件打包到mainbundle中,查找不到路径的解决的方法;以及在删除bundle中文件的可行性...

    在开发中有时我们须要把数据库文件打包到我们的项目中.一般我们都是在外部用工具生成数据库文件,然后拉入项目中.可是我们在程序中查找改文件时.返回的路径总是nil 解决的方法: 原因我们拉入其它资源文件( ...

  2. iOS 把数据库文件打包到mainbundle中,查找不到路径的解决办法;以及在删除bundle中文件的可行性

    在开发中有时我们需要把数据库文件打包到我们的项目中,一般我们都是在外部用工具生成数据库文件,然后拉入项目中,但是我们在程序中查找改文件时,返回的路径总是nil 解决办法: 原因我们拉入其他资源文件(比 ...

  3. vbs文件CreateObject(WScript.Shell)找不到中文路径的解决办法

    文章目录 问题出现 尝试解决 解决办法 第1步:把文件名改成txt 第2步:打开txt 第3步:点击`文件` 第4步:点击`另存为` 第5步:点击`编码` 第6步:将编码更改成ANSI 第7步:点击保 ...

  4. oracle数据库无法查询,关于oracle中无法查询中文条件的解决办法

    1. 检查一个简单的sql = select * from tb_user_master where name = '张三' 表中存有该数据,但是检索无结果 2.解决方法很简单 -   SELECT ...

  5. Android 将音乐文件打包到程序中并设置为铃声的详细方法介绍

    本文主要介绍如何将音乐文件打包到程序中并设置为铃声 首先,将我们的铃声文件放到res/raw目录下,没有的话就建一个raw目录 如图 canon.mp3文件放到raw目录下 然后在程序里读取这个文件: ...

  6. 使用webpack打包后,vscode中vue代码变白色的解决办法

    使用webpack打包后,vscode中vue代码变白色的解决办法 卸载vetur,重装vetur

  7. VSCode中.py文件找不到路径的解决办法

    遇到的问题: 近期通过VSCode学Python,但由于之前没系统性接触过命令行,所以一度造成了些许麻烦. 在VSCode里面运行xxx.py时,由于刚开始工作目录没有设置,按初始化的目录,需要一步步 ...

  8. 打包时出现的异常。XXXXXXX-1.0-SNAPSHOT.jar中没有主清单属性的解决办法

    打包时异常信息如下: Some problems were encountered while building the effective model for com.llq:redis:jar:1 ...

  9. 计算机内容的ppt,电脑打开ppt文件出错提示ppt中的内容有问题如何解决

    ‍ 今天在本文中主要介绍一下在电脑系统中打开ppt文件出错提示ppt中的内容有问题的解决方法.有个用户从网上下载了一些PPT,包括.ppt和.pptx两种版本文件,点击打开总是提示ppt的内容有问题. ...

最新文章

  1. 用户切换命令:su 与 sudo
  2. L8.1 lvs+heartbeat-ldirectord实现高可用负载均衡
  3. 成本直降50%,下一代网关震撼发布
  4. 《About Multi-Touch(多点触摸是个什么东西?)》:基于光学原理的多点触摸技术全解析...
  5. 玩转NumPy——NumPy数组的切片和索引
  6. P2700 逐个击破
  7. 判断一个IP是否归属于中国
  8. Sublime介绍安装和使用(转载)
  9. Linux下的I/O多路复用select,poll,epoll浅析
  10. 【Golang 接口自动化05】使用yml管理自动化用例
  11. Movie播放Gif,完美实现屏幕适配
  12. 讨论CGContextDrawImage
  13. echart markline 设置不同颜色_小学信息技术《设置文档格式》教案
  14. C语言中strstr函数
  15. uni app 自定义基座 真机调试 ios设备
  16. 2018第九届蓝桥杯B组决赛题解第四题 调手表
  17. scrapy框架爬取斗鱼女主播照片,依据颜值排行榜
  18. DM数据库的启停以及数据库状态检查
  19. C#怎么修改生成的EXE文件图标
  20. UniAccess Agent 的删除方法

热门文章

  1. 写一个垃圾桶开关盖子的动画其实很简单
  2. MySQL面试通关秘籍:这次你也可以在简历写上精通MySQL!
  3. 使用 ESP32 通过 AT 命令与 手机蓝牙进行配对连接
  4. 转型直播平台,放弃了社交“根据地”的陌陌还能走多远
  5. python异常数据处理_Python 异常处理和捕获信息教程
  6. 如果您无法收到来自iPhone用户的短信怎么办
  7. JavaScript数据类型及其返回值
  8. 很多朋友都在想,做软件测试有没有捷径可以走,有没有什么绝招?
  9. Kruskal算法与Prim算法
  10. php中的strtolower