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

                                      最近,不知道为什么,突然想写点数据库的知识。心想数据库很简单,不就是导入那几个包再加上依赖库就可。谁知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
   





      

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值