FMDB之间的使用

ARC 和 MRC

项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。

使用

在 FMDB 中有三个重要的类:

FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。

FMResultSet:用在 FMDatabase 中执行查询的结果的类。

FMDatabaseQueue:在多线程下查询和更新数据库用到的类。

数据库创建

FMDatabase 是通过一个 SQLite 数据库文件路径创建的,此路径可以是以下三者之一:

一个文件的系统路径。磁盘中可以不存在此文件,因为如果不存在会自动为你创建。

一个空的字符串 @""。会在临时位置创建一个空的数据库,当 FMDatabase 连接关闭时,该数据库会被删除。

NULL。会在内存中创建一个数据库,当 FMDatabase 连接关闭时,该数据库会被销毁。

// 创建数据库示例

FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];

打开数据库

数据库必须是打开状态,才能与之交互。如果没有足够的资源和权限来打开\创建数据库,数据库会打开失败。

数据库更新

SQL 语句中除过 SELECT 语句都可以称之为更新操作。包括 CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DROP,END,EXPLAIN,VACUUM,REPLACE 等。一般只要不是以 SELECT 开头的 SQL 语句,都是更新语句。

执行更新语句后会返回一个 BOOL 值,返回 YES 表示执行更新语句成功,返回 NO 表示出现错误,可以通过调用 -lastErrorMessage 和 -lastErrorCode 方法获取更多错误信息。

数据库查询

通过调用 -executeQuery... 方法之一执行 SELECT 语句进行数据库查询操作。

执行查询操作后,如果成功会返回一个 FMResultSet 对象,反之会返回 nil。通过 -lastErrorMessage 和 -lastErrorCode 方法可以确定为什么会查询失败。

为了遍历查询结果,需要 while() 循环,然后逐条记录查看。在 FMDB 中,可以通过下面的简单方式实现:

FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];

while ([s next]) {

// 每条记录的检索值

}

即使只需要获取一个数据,也还是必须在访问查询结果前调用 -[FMResultSet next]。

// 示例

FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];

if ([s next]) {

int totalCount = [s intForColumnIndex:0];

}

FMResultSet 提供了很多方便的方法来查询数据:

intForColumn:

longForColumn:

longLongIntForColumn:

boolForColumn:

doubleForColumn:

stringForColumn:

dateForColumn:

dataForColumn:

dataNoCopyForColumn:

UTF8StringForColumn:

objectForColumn:

这些方法都有一个 {type}ForColumnIndex: 变体,是基于列的位置来查询数据。

通常情况下,一个 FMResultSet 没有必要手动 -close,因为结果集合 (result set) 被释放或者源数据库关闭会自动关闭。

关闭数据库

当对数据库进行查询和更新操作完成后,需要调用 -close 关闭数据库 FMDatabase 的连接。

// 示例

[db close];



实例如下

-(void)initDB

{

NSString * theDomentpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString * path = [theDomentpath stringByAppendingPathComponent:@"PPP.sqlite"];

fmdb = [[FMDatabase alloc]initWithPath:path];

if ([fmdb open]) {

[fmdb executeUpdate:@"create table class (theID integer primary key ,name text , age text)"];

[fmdb close];

NSLog(@"数据库开辟成功");

}

else

{

NSLog(@"数据库开启失败");

}

}

-(NSMutableArray *)Marr

{

NSMutableArray * Marr = [NSMutableArray new];

[fmdb open];

FMResultSet * set = [[FMResultSet alloc]init];

set = [fmdb executeQuery:@"select * from class"];

while ([set next]) {

Model * mm = [[Model alloc]init];

mm.theID = [set intForColumn:@"theID"];

mm.name = [set stringForColumn:@"name"];

mm.age = [set stringForColumn:@"age"];

[Marr addObject:mm];

}

[fmdb close];

return Marr;

}

-(void)insertData:(Model *)theData

{

[fmdb open];

NSString * str = [[NSString alloc]initWithFormat:@"insert into class values (null,'%@','%@')",theData.name,theData.age];

BOOL isq = [fmdb executeUpdate:str];

if (isq) {

NSLog(@"添加成功");

}

else

{

NSLog(@"添加失败");

}

[fmdb close];

}

-(void)UpData:(Model *)theData

{

[fmdb open];

NSString * str = [NSString stringWithFormat:@"update class set name = '%@' , age = '%@' where theID = '%ld'",theData.name,theData.age,theData.theID];

BOOL isq = [fmdb executeUpdate:str];

if (isq) {

NSLog(@"修改成功");

}

else

{

NSLog(@"修改失败");

}

[fmdb close];

}

-(void)deleteData:(Model *)theData

{

[fmdb open];

NSString * str = [NSString stringWithFormat:@"delete from class where theID = '%ld'",theData.theID];

BOOL isq = [fmdb executeUpdate:str];

if (isq) {

NSLog(@"删除成功");

}

else

{

NSLog(@"删除失败");

}

[fmdb close];

}

你可能感兴趣的:(FMDB之间的使用)