在开发中有时我们须要把数据库文件打包到我们的项目中。一般我们都是在外部用工具生成数据库文件,然后拉入项目中。可是我们在程序中查找改文件时。返回的路径总是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  不存在返回NOBOOL isExist = [fm fileExistsAtPath:dbFilePath];//- (BOOL)fileExistsAtPath:(NSString *)path;//假设不存在 isExist = NO,拷贝project里的数据库到Documents下if (!isExist){//拷贝数据库//获取project里。数据库的路径,由于我们已在project中加入了数据库文件,所以我们要从project里获取路径NSString *backupDbPath = [[NSBundle mainBundle]pathForResource:@"exiu"ofType:@"db"];//这一步实现数据库的加入。// 通过NSFileManager 对象的复制属性。把project中数据库的路径拼接到应用程序的路径上BOOL cp = [fm copyItemAtPath:backupDbPath toPath:dbFilePath error:nil];NSLog(@"cp = %d",cp);//- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)errorNSLog(@"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

转载于:https://www.cnblogs.com/yutingliuyl/p/6795997.html

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

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

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

  2. PDF编辑方法,怎么删除PDF中的一页

    PDF文件越来越受大家的欢迎,PDF文件的修改编辑是需要用到PDF编辑器的,不知道大家在使用PDF文件的时候,编辑文件之后有没有文件中有页面需要删除的情况,在编辑文件的时候如果遇到文件中有页面需要删除 ...

  3. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)

    Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix).使用replace函数批量删除列名中的后缀(suffix) 目录

  4. Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix)、使用replace函数批量删除列名中的前缀(prefix)

    Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix).使用replace函数批量删除列名中的前缀(prefix) 目录

  5. 关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决的方法

    关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决的方法 参考文章: (1)关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决的方法 (2)https: ...

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

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

  7. 批处理文件中获取当前所在路径的几种方法,以及写文件到txt

    @echo off setlocal EnableDelayedExpansion echo 当前正在运行的批处理文件所在路径:!cd! pause @echo off echo 当前目录是:%cd% ...

  8. 在Python中查找子字符串索引的5种方法

    在Python中查找字符串中子字符串索引的5种方法 (5 Ways to Find the Index of a Substring in Strings in Python) str.find() ...

  9. python处理列表中字典_Python列表嵌套字典的时候,如果要删除列表中其中一个字典要如何操作...

    如果要删除列表中其中一个字典要操作如下 第一种方法 1.1 name_list=[{"name":"张三","age":18},{" ...

最新文章

  1. pandas将dataframe原有的数据列名称转化为整数数值列名称(convert dataframe column labelsl into integers)
  2. 重磅!2017年度互联网转型企业TOP5发布 | 2017极客大奖年度评选
  3. Thymeleaf 常用属性
  4. boost::detail模块fwd容器的测试程序
  5. 机器学习:利用卷积神经网络实现图像风格迁移 (一)
  6. 使用腾讯云发送短信API接口实现(完整流程)
  7. 建筑公司木地板WordPress企业网站模板
  8. CISA:很多受害者和 SolarWinds 之间并不直接相关
  9. Kylin 对维度表的的要求
  10. pytorch_LSTM预测股票行情
  11. 计算机技术在图形图像处理中的应用,计算机图形图像处理技术综述
  12. 如何写好一份数据分析报告
  13. 新旧电脑安装win11系统【超简单教程】
  14. 【计划表合集】学习计划表/时间表/打卡表/理财表/读书记录/生活计划表等合集
  15. 刷脸时代:勿信谣言,告诉你真实的刷脸支付系统
  16. ShellNet:Efficient Point Cloud Convolutional Neural Networks using Concentric Shells Statics
  17. Unity3d游戏画面实时同步html5或WebGL中(基于FMETP STREAM)
  18. SylixOS中的几个常用虚拟设备文件
  19. 络达开发----如何开启AGC功能
  20. QDU 18 反转数字

热门文章

  1. C# SqlCommand 数据库连接操作
  2. 怎么把word文档转换成PDF?
  3. cdr格式文件photoshop打开失败错误类型怎么办
  4. 2023年大学生如何申请GitHub学生包看这个就够了
  5. [**奇文共赏**参考理解] 据说看五遍能懂的人智商 200
  6. 苹果手机电池恢复方法_苹果删除的照片怎么恢复?真的能找回,这些方法赶紧看!...
  7. 于千万人之中,你是匠人(转贴)
  8. 【蓝桥杯选拔赛真题14】Scratch计算时间 少儿编程scratch蓝桥杯选拔赛真题讲解
  9. RESTful风格的API设计
  10. 马云证婚的主播CP:太太像赵丽颖,不到一年养成两家三皇冠店