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

本文主要是介绍iOS 把数据库文件打包到mainbundle中,查找不到路径的解决办法;以及在删除bundle中文件的可行性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于iOS 把数据库文件打包到mainbundle中,查找不到路径的解决办法;以及在删除bundle中文件的可行性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097063

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

利用Python把路径转为绝对路径的方法

《利用Python把路径转为绝对路径的方法》在Python中,如果你有一个相对路径并且想将其转换为绝对路径,你可以使用Path对象的resolve()方法,Path是Python标准库pathlib中... 目录1. os.path.abspath 是什么?怎么用?基本用法2. os.path.abspat

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方