配色: 字号:
iOS开发中使用FMDB来使程序连接SQLite数据库
2016-12-06 | 阅:  转:  |  分享 
  
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中的代码段,最后提交事务。























献花(0)
+1
(本文系白狐一梦首藏)