您的位置:首页 > 数据库

最新Xcode7(ios9) FMDB 的常用Sql语句的使用和接入过程中遇到的错误解决

2015-12-03 11:00 691 查看


最近,不知道为什么,突然想写点数据库的知识。心想数据库很简单,不就是导入那几个包再加上依赖库就可。谁知Xcode 更新后还真的不好弄。我这一些快一天了。遇到了更重问题 ,并对添加一些不常用的功能。下面我们就开始。进入 蓝天岁月:

1、 一些网站上下载FMDB第三方库,很多不给出地址了。下载后将fmbb 文件拖拽到你的工程里面。注意:看下文件是否为***。***为正确状态。不是就回出现,文件路径问题。

解决:再拖入时弹出的对话框,里面勾选

这三个,就可以

2、添加第三方库后,就是要添加 FMDB 唯一的依赖库 libsqlite3.dylib ,问题来了,怎么Xcode 找不到了呢。但是 又出现了个 libsqlite3.tbd 妈的就是它了。高兴地一运行,MDMD 有错误,为什么呢??? 以前不是导入就OK 了吗?? 查了更新 问题 解决方法是: Other Linker Flag 添加 -lz 和 -libsqlite3 。运行 OK。

3、写一个全局的单利,全工程提供,整个步骤 如下:

//创建一个单利 目的:全工程提供

+(ZSJ_FmdbShare*)fmdbShare_zsj;

实现单利:

/*****************************************************************/

//创建一个单利

+(ZSJ_FmdbShare*)fmdbShare_zsj{

static ZSJ_FmdbShare * ShareManager =nil;

if (ShareManager ==
nil) {

ShareManager= [[[self
class] alloc]init];

}

return ShareManager;

}

//实现单利要实现下面的几个方法
都是保证对象是一个地址

-(id)init{

if ([superinit]) {

//这里写初始化的处理事件

//
进行数据库的创建

[self createFmdb];

}

return
self;

}

/*****************************************************************/

4、创建一个表格 table

/*****************************************************************/

-(void)createFmdb{


//创建数据库对象在路径下

RootDataBase_Zsj = [[FMDatabasealloc]initWithPath:[selfgetPathOfFmdb]];


//判断数据库是否打开

if ([selfisOpen]) {

//创建数据表

NSString * Sql_Sentence =@"create table if not exists t_Phone("

"name text,"

"phonenumber text,"

"consumerid long,"

"isshow bit,"

"indexf long"

")";

/*

创建时,写参数是不要和
关键字同名 ,否则将创建失败

"index_t long,"
这样写是能创建成功的、

"index long,"
这样写是创建失败的

*/

BOOL succed = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence];

if (succed) {

NSLog(@"创建成功");

[self isClose];

}else{

NSLog(@"创建失败");

}

}else{

return;

}

}

/*****************************************************************/

5、实现数据库的读写和关闭

//判断数据库 是否打开

-(BOOL)isOpen;

//判断数据库 是否关闭

-(BOOL)isClose;

方法的实现:

/*****************************************************************/

-(BOOL)isOpen{

returnRootDataBase_Zsj.open;

}

/*****************************************************************/

-(BOOL)isClose{

returnRootDataBase_Zsj.close;

}

/*****************************************************************/

6、创建数据库其保存路径

/*****************************************************************/

-(NSString*)getPathOfFmdb{

//获取路径数组

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString *documents = [paths
objectAtIndex:0];


//进行路径的拼接

NSLog(@"%@",[documentsstringByAppendingPathComponent:DBNAME]);

return [documentsstringByAppendingPathComponent:DBNAME];

}

这里会有一个大的问题,现在写的是对的

/*****************************************************************/

7、向数据库里面,保存数据

/*****************************************************************/

//存入数据

//对从传来的数据要进行处理,转化为Nsnumber对象

-(void)saveDate:(id)wantonlyObjiect{

if ([selfisOpen]) {

NSString * Sql_Sentence=@" insert into t_Phone (name,phonenumber,consumerid,isshow,indexf) values ( ?,?,?,?,?)";

BOOL Insert = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence,wantonlyObjiect[@"name"],wantonlyObjiect[@"phonenumber"],[NSNumbernumberWithLong:[wantonlyObjiect[@"consumerid"]intValue]],[NSNumbernumberWithBool:[wantonlyObjiect[@"isshow"]boolValue]],[NSNumbernumberWithLong:[wantonlyObjiect[@"indexf"]longValue]]];

if (Insert) {

NSLog(@"插入成功");

[self
isClose];

}else{

NSLog(@"插入数据库失败");

}

}else{

NSLog(@"数据库处于关闭状态");

}

}

注意类型的转化;

/*****************************************************************/

8、数据库,里面的数据更新

/*****************************************************************/

//更新数据

//更新 indexf
为2的
将名字改为 小明

-(void)update:(NSArray*)up_array{

if ([selfisOpen]) {

NSString * Sql_Sentence = [NSStringstringWithFormat:@"update
%@ set name = ? where indexf = ? ",@"t_Phone"];

BOOL isupdate = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,up_array[0],[NSNumbernumberWithLong:[up_array[1]intValue]]];

if (isupdate) {

NSLog(@"更新成功");

[self
isClose];

}else{

NSLog(@"更新失败");

}

}else{

NSLog(@"更新数据库,处于关闭状态");

}

}

/*****************************************************************/

9、数据库里面的数据的查找

/*****************************************************************/

-(NSArray*)selectdict_where:(NSArray*)wherearray{

if ([selfisOpen]) {

NSString * Sql_Sentence =@" select * from t_Phone where name = ?";

NSMutableArray *array = [[NSMutableArrayalloc]
init];

FMResultSet * result_zsj = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,@"程倩倩"];

while ([result_zsj
next]) {

NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];

[parm setObject:[result_zsj
stringForColumn:@"name"]
forKey:@"name"];

[parm setObject:[result_zsj
stringForColumn:@"phonenumber"]
forKey:@"phonenumber"];

[parm setObject:[result_zsj
stringForColumn:@"consumerid"]
forKey:@"consumerid"];

[parm setObject:[result_zsj
stringForColumn:@"isshow"]
forKey:@"isshow"];

[parm setObject:[result_zsj
stringForColumn:@"indexf"]
forKey:@"indexf"];

[array addObject:parm];

}

[self isClose];

return array;

}else{

NSLog(@"查询数据库,处于关闭状态");

return nil;

}

}

10、数据库里面,数据的删除

/*****************************************************************/

//删除数据

-(void)deletedata:(NSArray*)deletearray{

if ([selfisOpen]) {

NSString * Sql_Sentence = [NSStringstringWithFormat:@" delete from t_Phone where %@ =?",deletearray[0]];

BOOL isdelete = [RootDataBase_ZsjexecuteUpdate:Sql_Sentence,deletearray[1]];

if (isdelete) {

NSLog(@"删除成功");

[self
isClose];

}

}else{

NSLog(@"删除数据库,处于关闭状态");

}

}

11、限制获取数据个数的获取数据

/*****************************************************************/

//限制性的获取 数据的个数

-(NSArray*)getdatalimit:(NSArray*)_limit{

if ([selfisOpen]) {

NSString * Sql_Sentence = [NSStringstringWithFormat:@" select * from t_Phone limit %@,%@",_limit[0],_limit[1]];

FMResultSet * islimit = [RootDataBase_ZsjexecuteQuery:Sql_Sentence];

NSMutableArray * MTA = [NSMutableArrayarrayWithCapacity:0];

while ([islimit
next]) {

NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];

[parm setObject:[islimit
stringForColumn:@"name"]
forKey:@"name"];

[parm setObject:[islimit
stringForColumn:@"phonenumber"]
forKey:@"phonenumber"];

[parm setObject:[islimit
stringForColumn:@"consumerid"]
forKey:@"consumerid"];

[parm setObject:[islimit
stringForColumn:@"isshow"]
forKey:@"isshow"];

[parm setObject:[islimit
stringForColumn:@"indexf"]
forKey:@"indexf"];

[MTA addObject:parm];

}

[self isClose];

return MTA;

}else{

return nil;

}

}

12、从数据库里面,获取数据,并排序

/*****************************************************************/

//获取数据的排序 desc 降 asc


-(NSArray*)getdatesequence:(NSArray*)sequenceparameter sequencetype:(NSArray*)_sequencetype{

if ([selfisOpen]) {

NSString * Sql_Sentence = [NSStringstring];

if (sequenceparameter.count>1) {

Sql_Sentence =@" select * from t_Phone order by ";

for (int i =0 ; i<sequenceparameter.count; i++) {

if (i==_sequencetype.count -1) {

Sql_Sentence = [Sql_Sentence stringByAppendingString:sequenceparameter[i]];

Sql_Sentence = [Sql_Sentence stringByAppendingString: [NSStringstringWithFormat:@"%@",_sequencetype[i]]];

}else{

Sql_Sentence = [Sql_Sentence stringByAppendingString:sequenceparameter[i]];

Sql_Sentence = [Sql_Sentence stringByAppendingString: [NSStringstringWithFormat:@"%@ ,",_sequencetype[i]]];

}

}



}else{

Sql_Sentence = [NSString
stringWithFormat:@" select * from t_Phone order by %@ %@ ",sequenceparameter[0],_sequencetype[0]];

}

FMResultSet * issequence = [RootDataBase_ZsjexecuteQuery:Sql_Sentence];

NSMutableArray * MTA = [NSMutableArrayarrayWithCapacity:0];

while ([issequence
next]) {

NSMutableDictionary * parm = [[NSMutableDictionaryalloc]init];

[parm setObject:[issequence
stringForColumn:@"name"]
forKey:@"name"];

[parm setObject:[issequence
stringForColumn:@"phonenumber"]
forKey:@"phonenumber"];

[parm setObject:[issequence
stringForColumn:@"consumerid"]
forKey:@"consumerid"];

[parm setObject:[issequence
stringForColumn:@"isshow"]
forKey:@"isshow"];

[parm setObject:[issequence
stringForColumn:@"indexf"]
forKey:@"indexf"];

[MTA addObject:parm];

}

[self isClose];

return MTA;

}else{

return nil;

}

}

13、数据的防重

/******************************************************************/

//数据库的条件查重功能

-(BOOL)preventrecur:(NSDictionary*)_preventrecur{

if ([selfisOpen]) {

NSString * Sql_Sentence =@"select * from t_Phone where indexf = ?";

FMResultSet * result = [RootDataBase_ZsjexecuteQuery:Sql_Sentence,[NSNumbernumberWithLong:[_preventrecur[@"indexf"]longValue]]];

return [result
next];

}else{

return nil;

}

}

14、数据库的调用和打印结果

/***********************************************************/

//创建单利对象

ZSJ_FmdbShare * Fb_ZSJ = [ZSJ_FmdbSharefmdbShare_zsj];



/***********************************************************/


// 将获取的数据,插入到数据库里面 要注意:数据类型的转换

for (NSDictionary * ghin Dict) {

if (![Fb_ZSJ
preventrecur:gh]) {

[Fb_ZSJ saveDate:gh];

}

}

/***********************************************************/

//
更新数据库 :index = 3 的用户,将名字改为
小明

[Fb_ZSJ update:@[@"小明",@3]];

/***********************************************************/

//删除数据库:删除 Indexf = 2的用户

[Fb_ZSJ deletedata:@[@"indexf",[NSNumbernumberWithLong:2]]];

/***********************************************************/


//查询用户信息:支持单个条件查询

[Fb_ZSJ selectdict_where:@[@"indexf",[NSNumbernumberWithLong:0]]];

NSLog(@"%@",[Fb_ZSJselectdict_where:@[@"indexf",[NSNumbernumberWithLong:0]]]);

/*打印结果:

2015-12-03 01:24:46.557 ZSJ_FMDB_SQL[3014:97158] (

{

consumerid = 0;

indexf = 12;

isshow = 1;

name = "\U7a0b\U5029\U5029";

phonenumber = 15565267907;

}

)

*/

/***********************************************************/


// 限制的获取指定个数的
数据

[Fb_ZSJ getdatalimit:@[@"1",@"3"]];

NSLog(@"%@",[Fb_ZSJgetdatalimit:@[@"1",@"3"]]);

/*打印结果

2015-12-03 09:19:36.729 ZSJ_FMDB_SQL[3684:123633] (

{

consumerid = 1;

indexf = 12;

isshow = 1;

name = "\U8d75\U6708";

phonenumber = 13643766238;

},

{

consumerid = 2;

indexf = 12;

isshow = 1;

name = "\U674e\U5a77\U5a77";

phonenumber = 13607611831;

},

{

consumerid = 3;

indexf = 12;

isshow = 1;

name = "\U59ec\U8273\U4e3d";

phonenumber = 18839271609;

}

)

*/

/***********************************************************/

//
获取数据的排序 desc
降序 asc 升序

[Fb_ZSJ getdatesequence:@[@"indexf"]sequencetype:@[@"desc"]];

NSLog(@"%@", [Fb_ZSJ getdatesequence:@[@"indexf"]sequencetype:@[@"desc"]]);

/*

打印结果

2015-12-03 10:00:42.887 ZSJ_FMDB_SQL[4169:144204] (

{

consumerid = 4;

indexf = 4;

isshow = 0;

name = "\U66f9\U4e66\U57f9";

phonenumber = 13673461626;

},

{

consumerid = 3;

indexf = 3;

isshow = 0;

name = "\U59ec\U8273\U4e3d";

phonenumber = 18839271609;

},

{

consumerid = 1;

indexf = 1;

isshow = 0;

name = "\U8d75\U6708";

phonenumber = 13643766238;

},

{

consumerid = 0;

indexf = 0;

isshow = 0;

name = "\U7a0b\U5029\U5029";

phonenumber = 15565267907;

}

)

*/

15、遇到的为题和解决方法
1、libsqlite3 的改变,不说了
2、open!14 的错误
这是你数据库保存路径出现了问题,问题在于最后拼接处,少了一个“/” ,如果,你的出现了这个问题,请及时查看
3、插入数据失败,或者等
这个问题是个大问题,原因也很多,但是也有主要的原因:第一:可能是你的数据库路径不对,如第二条。 第二:是你参数的类型,不对(主要是没有进行类型的转化)。 第三:可能是你 Sql 语句的 错误(我就遇到了,弄了好久)。

16、完整项目的下载:

http://download.csdn.net/detail/zhoushuangjian511/9322019
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: