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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3