美文网首页
FMDB之间的使用

FMDB之间的使用

作者: 老傅_cac3 | 来源:发表于2017-05-15 08:02 被阅读0次

    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之间的使用

          本文链接:https://www.haomeiwen.com/subject/nednattx.html