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 不存在返回NO
BOOL 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 **)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
iOS 把数据库文件打包到mainbundle中,查找不到路径的解决的方法;以及在删除bundle中文件的可行性的更多相关文章
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...
- 批处理文件中获取当前所在路径的几种方法,以及写文件到txt
@echo off setlocal EnableDelayedExpansion echo 当前正在运行的批处理文件所在路径:!cd! pause @echo off echo 当前目录是:%cd% ...
- 【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
介绍 晚上无聊的时候,我做了一个測试题,測试题的大体意思是:删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录. 比如: I have a map with duplicate val ...
- 【IDEA】IDEA中配置tomcat虚拟路径的两种方法
首先要确保使用的是本地的tomcat服务器,而不是maven插件. -------------------------第一种:使用IDEA工具自动配置(推荐这种)------------------- ...
- android中常见的内存泄漏和解决的方法
android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...
- struts.xml中出现extends undefined package struts-default解决的方法
在struts.xml中出现extends undefined package struts-default,经过查阅资料原来是由于没有联网的缘故. 这样解决:在myeclipse中关联本地的dtd文 ...
- 关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决的方法
首先说明一下我的系统配置:ubuntu 12.04 gcc 4.6.3 有几天没有使用ubuntu了,今天拿出来编程序,刚開始编译一个uboot1.1.6的代码.出现了stdio.h:没有那么 ...
- 【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
依据guigui111111的建议:先把Map按Key从大到小排序,然后再把Key和Value互换.这也是一种非常好的思路,我写了一下代码,顺便贴上来,供大家參考与分享. package shuai. ...
- Windows中查找命令的路径 (类似Linux中的which命令)
where is a direct equivalent: C:\Users\Joey>where cmdC:\Windows\System32\cmd.exeNote that in Powe ...
随机推荐
- Python基础之yield,匿名函数,包与re模块
一.表达式形式的yield 1.另外一种形式的yield def deco(func): def wrapper(*arges, **kwargs): res = func(*arges, **kwa ...
- ORA-02437 违反主键
在给study用户下的semp表建立主键的时候,出现以下错误:SQL> alter table semp add constraint pk_emp primary key(empno);alt ...
- hlg 1580 tell me the length
智力题,观察上一行,有几个数字. 比如,S[1]=1; S[2]=11; S[3]=21; S[4]=1211; 这样就可以观察出来,序列一是1个1 ---> S[2] = 11 ; 序列二是 ...
- 九度oj 题目1114:神奇的口袋
题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...
- HackerRank# Stock Maximize
原题地址 不知道为什么要用动态规划做,明明是扫几遍就行了啊 HackerRank上的题目特别喜欢long long类型啊,不用就爆.. 代码: #include <cmath> #incl ...
- [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...
- BZOJ 1036: [ZJOI2008]树的统计Count 【树链剖分】
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
- P1133 教主的花园 (动态规划)
题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢 3种树,这3种 ...
- 线段树练习5(codevs 4927)
题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的所有数都增加c set a b c:把区间[a,b]内的所有数都设为c sum a b:查询区间[a,b] ...
- 对象数据源objectdatasource的使用,类的编写实现查询增删改的方法
原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...