iOS开发中使用FMDB来使程序连接SQLite数据库
这篇文章主要介绍了iOS开发中使用FMDB来使程序连接SQLite数据库,SQLite是一个简单的嵌入式数据库,非常适合轻量级使用,需要的朋友可以参考下
一、简单说明
1.什么是FMDB
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
2.FMDB的优点
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的CoreData框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地防止数据混乱
3.FMDB的github地址
https://github.com/ccgus/fmdb
二、核心类
FMDB有三个主要的类
(1)FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
(2)FMResultSet
使用FMDatabase执行查询后的结果集
(3)FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
三、打开数据库
通过指定SQLite数据库文件路径来创建FMDatabase对象
复制代码代码如下:
FMDatabasedb=[FMDatabasedatabaseWithPath:path];
if(![dbopen]){
NSLog(@"数据库打开失败!");
}
文件路径有三种情况
(1)具体文件路径
如果不存在会自动创建
(2)空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除
(3)nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
四、执行更新
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等
使用executeUpdate:方法执行更新
复制代码代码如下:
-(BOOL)executeUpdate:(NSString)sql,...
-(BOOL)executeUpdateWithFormat:(NSString)format,...
-(BOOL)executeUpdate:(NSString)sqlwithArgumentsInArray:(NSArray)arguments
示例
复制代码代码如下:
[dbexecuteUpdate:@"UPDATEt_studentSETage=?WHEREname=?;",@20,@"Jack"]
五、执行查询
查询方法
复制代码代码如下:
-(FMResultSet)executeQuery:(NSString)sql,...
-(FMResultSet)executeQueryWithFormat:(NSString)format,...
-(FMResultSet)executeQuery:(NSString)sqlwithArgumentsInArray:(NSArray)arguments
示例
复制代码代码如下:
//查询数据
FMResultSetrs=[dbexecuteQuery:@"SELECTFROMt_student"];
//遍历结果集
while([rsnext]){
NSStringname=[rsstringForColumn:@"name"];
intage=[rsintForColumn:@"age"];
doublescore=[rsdoubleForColumn:@"score"];
}
六、代码示例
1.新建一个项目,导入libsqlite3库,并在项目中包含主头文件
2.下载第三方框架FMDB
3.示例代码
YYViewController.m文件
复制代码代码如下:
////YYViewController.m//04-FMDB基本使用////Createdbyappleon14-7-27.//Copyright(c)2014年wendingding.Allrightsreserved.//
#import"YYViewController.h"#import"FMDB.h"
@interfaceYYViewController()@property(nonatomic,strong)FMDatabasedb;@end
@implementationYYViewController
-(void)viewDidLoad{[superviewDidLoad];//1.获得数据库文件的路径NSStringdoc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];NSStringfileName=[docstringByAppendingPathComponent:@"student.sqlite"];//2.获得数据库FMDatabasedb=[FMDatabasedatabaseWithPath:fileName];//3.打开数据库if([dbopen]){//4.创表BOOLresult=[dbexecuteUpdate:@"CREATETABLEIFNOTEXISTSt_student(idintegerPRIMARYKEYAUTOINCREMENT,nametextNOTNULL,ageintegerNOTNULL);"];if(result){NSLog(@"创表成功");}else{NSLog(@"创表失败");}}self.db=db;
}
-(void)touchesBegan:(NSSet)toucheswithEvent:(UIEvent)event{[selfdelete];[selfinsert];[selfquery];}
//插入数据-(void)insert{for(inti=0;i<10;i++){NSStringname=[NSStringstringWithFormat:@"jack-%d",arc4random_uniform(100)];//executeUpdate:不确定的参数用?来占位[self.dbexecuteUpdate:@"INSERTINTOt_student(name,age)VALUES(?,?);",name,@(arc4random_uniform(40))];//[self.dbexecuteUpdate:@"INSERTINTOt_student(name,age)VALUES(?,?);"withArgumentsInArray:@[name,@(arc4random_uniform(40))]];//executeUpdateWithFormat:不确定的参数用%@、%d等来占位//[self.dbexecuteUpdateWithFormat:@"INSERTINTOt_student(name,age)VALUES(%@,%d);",name,arc4random_uniform(40)];}}
//删除数据-(void)delete{//[self.dbexecuteUpdate:@"DELETEFROMt_student;"];[self.dbexecuteUpdate:@"DROPTABLEIFEXISTSt_student;"];[self.dbexecuteUpdate:@"CREATETABLEIFNOTEXISTSt_student(idintegerPRIMARYKEYAUTOINCREMENT,nametextwww.sm136.comNOTNULL,ageintegerNOTNULL);"];}
//查询-(void)query{//1.执行查询语句FMResultSetresultSet=[self.dbexecuteQuery:@"SELECTFROMt_student"];//2.遍历结果while([resultSetnext]){intID=[resultSetintForColumn:@"id"];NSStringname=[resultSetstringForColumn:@"name"];intage=[resultSetintForColumn:@"age"];NSLog(@"%d%@%d",ID,name,age);}}
@end
打印查看结果:
提示:
如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是从0开始,而是接着之前的ID进行编号。
注意:
不要写成下面的形式,不要加'''',直接使用%@,它会自动认为这是一个字符串。
七、FMDB数据库队列1.代码示例
(1).需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。
(2).代码如下:
复制代码代码如下:
////YYViewController.m//05-FMDB数据库队列////Createdbyappleon14-7-28.//Copyright(c)2014年wendingding.Allrightsreserved.//
#import"YYViewController.hwww.visa158.com"#import"FMDB.h"
@interfaceYYViewController()@property(nonatomic,strong)FMDatabaseQueuequeue;@end
@implementationYYViewController
-(void)viewDidLoad{[superviewDidLoad];//1.获得数据库文件的路径NSStringdoc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];NSStringfileName=[docstringByAppendingPathComponent:@"person.sqlite"];//2.获得数据库队列FMDatabaseQueuequeue=[FMDatabaseQueuedatabaseQueueWithPath:fileName];//FMDatabasedb=[FMDatabasedatabaseWithPath:fileName];//3.打开数据库[queueinDatabase:^(FMDatabasedb){BOOLresult=[dbexecuteUpdate:@"CREATETABLEIFNOTEXISTSt_person(idintegerPRIMARYKEYAUTOINCREMENT,nametextNOTNULL,ageintegerNOTNULL);"];if(result){NSLog(@"创表成功");}else{NSLog(@"创表失败");}}];self.queue=queue;}
-(void)touchesBegan:(NSSet)toucheswithEvent:(UIEvent)event{//插入数据//[self.queueinDatabase:^(FMDatabasedb){//[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@22];//}];//查询数据[self.queueinDatabase:^(FMDatabasedb){//1.执行查询语句FMResultSetresultSet=[dbexecuteQuery:@"SELECTFROMt_person"];
//2.遍历结果while([resultSetnext]){intID=[resultSetintForColumn:@"id"];NSStringname=[resultSetstringwww.hunanwang.netForColumn:@"name"];intage=[resultSetintForColumn:@"age"];NSLog(@"%d%@%d",ID,name,age);}}];
}
@end
先插入数据,之后查询结果,打印如下:
(3).代码说明
有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
2.事务事务,没有事务的话会出现问题。举例:银行的例子
张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。事务代码处理:把多条语句添加到一个事务中去执行:
复制代码代码如下:
//插入数据[self.queueinDatabase:^(FMDatabasedb){[dbbeginTransaction];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@22];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@23];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@24];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@25];[dbcommit];}];
如果中途出现问题,那么会自动回滚,也可以选择手动回滚。
复制代码代码如下:
//插入数据[self.queueinDatabase:^(FMDatabasedb){[dbbeginTransaction];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@22];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@23];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@24];[dbrollback];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@25];[dbcommit];}];
上面的代码。前三条插入语句是作废的。
事务处理的另一种方式:
复制代码代码如下:
[self.queueinTransaction:^(FMDatabasedb,BOOLrollback){[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@22];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@23];[dbexecuteUpdate:@"INSERTINTOt_person(name,age)VALUES(?,?);",@"wendingding",@24];}];
说明:先开事务,再开始事务,之后执行block中的代码段,最后提交事务。
|
|