FMDB是第三方数据存储框架。与SQLite和CoreData相比,它有很多优点。FMDB是面向对象的。它以OC的形式封装了SQLite的C语言API,使用起来更方便,不需要太多的数据库操作知识。但是它也有一些问题,比如跨平台,因为是用oc语言封装的,所以只能用于ios开发,如果要实现跨平台运行,降低开发维护成本,您需要使用更原始的SQLite。CoreData是ORM的一种体现。CoreData的使用需要模型数据的转换。虽然操作简单,不需要直接操作数据库,但是性能没有直接使用SQLite高。但是在使用SQLite的时候,需要用到c语言中的函数,操作比较繁琐,所以需要进行封装。但是如果只是单纯的封装,很可能会忽略很多重要的细节,比如如何处理并发和安全问题。所以这里推荐使用第三方框架FMDB,它封装了libsqlite3框架。使用的步骤和SQLite类似,都是处理多个线程对一张表的同时操作,也就是一个线程。安全的。FMDB是一个轻量级的框架,使用起来很灵活。是很多企业发展的首选。FMDB中重要的类FMDatabase:一个FMDatabase对象代表一个单独的SQLite数据库,用于执行SQL语句FMResultSet:使用FMDatabase执行查询后的结果集Thread-safeFMDB使用步骤1.下载FMDB文件fmdb下载地址,将FMDB文件夹添加到项目中2.导入sqlite框架,导入FMDatabase.h文件3.类似SQLite使用步骤,需要获取数据库文件路径,然后获取数据库,打开数据库,然后操作上数据库,最后关闭数据库。代码如下所示://ViewController.m//JRFMDB////Createdbyjereheduon15/6/18.//Copyright(c)2015jerehedu.Allrightsreserved.//#import"ViewController.h"#import"FMDatabase.h"@interfaceViewController()@property(nonatomic,strong)FMDatabase*db;@end@implementationViewController-(void)viewDidLoad{[superviewDidLoad];//导入sqlite框架,导入FMDB文件夹//1.获取数据库文件路径NSString*doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];NSString*fileName=[docstringByAppendingPathComponent:@"student.sqlite"];NSLog(@"fileName=%@",fileName);//2。获取数据库FMDatabase*db=[FMDatabasedatabaseWithPath:fileName];//3.打开数据库if([dbopen]){NSLog(@"ok");//4.建表BOOLresult=[dbexecuteUpdate:@"CREATETABLEIFNOTEXISTSt_student(idintegerPRIMARYKEYAUTOINCREMENT,nametextNOTNULL,ageintegerNOTNULL);"];if(result){NSLog(@"建表成功");}else{NSLog(@"建表失败");}}self.db=db;//插入数据[selfinsertStu];[selfdeleteStu:6];[selfupdateStu:@"apple7_name":@"7777"];[selfqueryStu];[selfdropStu];[selfinsertStu];[selfqueryStu];//6.关闭数据库[self.dbclose];}#pragmamarkinsertdata-(void)insertStu{for(inti=0;i<10;i++){NSString*name=[NSStringstringWithFormat:@"1apple%i_name",i];intage=arc4random()%3+20;//1.executeUpdate:不确定使用?放置参数(后面的参数必须是oc对象)[self.dbexecuteUpdate:@"INSERTIINTOt_student(name,age)VALUES(?,?);",name,@(age)];//2.executeUpdateWithFormat:不确定参数被%@,%d等占用(参数为原始数据类型)//[self.dbexecuteUpdateWithFormat:@"insertintot_student(name,age)values(%@,%i);",name,age];//3.Array//[self.dbexecuteUpdate:@"INSERTIINTOt_student(name,age)VALUES(?,?);"withArgumentsInArray:@[name,@(age)]];}}#pragmamarkdeleteData-(void)deleteStu:(int)idNum{//a.executeUpdate:不确定参数使用?占位(后面的参数必须是oc对象)//[self.dbexecuteUpdate:@"deletefromt_studentwhereid=?;",@(idNum)];//b.executeUpdateWithFormat:不确定参数使用%@,%d等发生//[self.dbexecuteUpdateWithFormat:@"deletefromt_studentwherename=%@;",@"apple9_name"];}#pragmamarkdestroytable-(void)dropStu{[self.dbexecuteUpdate:@"droptableifexistst_student;"];//4.创建表BOOLresult=[self.dbexecuteUpdate:@"CREATETABLEIFNOTEXISTSt_student(idintegerPRIMARYKEYAUTOINCREMENT,nametextNOTNULL,ageintegerNOTNULL);"];if(result){NSLog(@"再次创建表成功");}else{NSLog(@"再次创建表失败");}}#pragmamark修改数据-(void)updateStu:(NSString*)oldName:(NSString*)newName{//[self.dbexecuteUpdateWithFormat:@"updatet_studentsetname=%@wherename=%@;",newName,oldName];[self.dbexecuteUpdate:@"updatet_studentsetname=?wherename=?",newName,oldName];}#pragmamark查询数据-(void)queryStu{//1.执行查询语句//FMResultSet*resultSet=[self.dbexecuteQuery:@"select*fromt_student;"];FMResultSet*resultSet=[self.dbexecuteQuery:@"select*fromt_studentwhereid;",@(14)];//2.遍历结果集while([resultSetnext]){intidNum=[resultSetintForColumn:@"id"];NSString*名称=[结果etobjectForColumnName:@"name"];intage=[resultSetintForColumn:@"age"];NSLog(@"id=%i,name=%@,age=%i",idNum,name,age);}}-(void)didReceiveMemoryWarning{[superdidReceiveMemoryWarning];//处理任何可以重新创建的资源。}@end
