FMDB

作者: yi叶知秋 | 来源:发表于2016-06-30 16:16 被阅读1095次

    FMDB简介
    iOS中原生的SQLite API在使用上相当不好用,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的代码库,例如FMDB、PlausibleDatabase、SQLitePersistentObjects等。

    FMDB第三方数据库>>>对系统数据库的封装>>>比系统数据库简单

    FMDatabase :封装了常用的sql操作语句
    FMDatabaseAdditions :封装了多线程以及版本使用时的数据库操作
    FMResultSet:结果集 每一个操作都会在结果集上得到结果

    注意事项 :
    使用 FMDB 先要导入系统库 libsqlite3.0.dylib

    ARC工程添加MRC文件: -fno-objc-arc
    MRC工程添加ARC文件: -fobjc-arc
    如果一个工程为MRC,其中要添加ARC的文件:
    选择target - build phases - compile sources - 单击ARC的文件将compiler flags设置为:-fobjc-arc
    如果一个工程为ARC,其中要添加MRC的文件:
    同样的路径,然后单击MRC的文件将compiler flags设置为:-fno-objc-arc

    #import <Foundation/Foundation.h>
    #import "FMDB.h"
    #import "People.h"
    
    @interface DatabaseTool : NSObject
    {
        //    FMDatabase *_db;//实例变量
    }
    //创建表
    //一般在 AppDelegate 中就使用此方法,程序一运行就创建表
    + (void)createTable;
    //查询所有的联系人
    + (NSMutableArray *)selectAllContact;
    //添加联系人
    + (void)inserIntoContact:(People *)p;
    //修改联系人
    + (void)updateContact:(People *)p;
    //删除联系人
    + (void)deleteContact:(int)cid;
    @end
    
    
    
    
    #import "DatabaseTool.h"
    
    //声明一个真正的全局变量
    static FMDatabase *_db = nil;
    
    @implementation DatabaseTool
    
    + (BOOL)openDatabase
    {
        //数据库文件路径
        NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/contact.sqlite"];
        //创建数据库对象
        if (_db == nil)
        {
            //根据路径创建数据库对象
            _db = [[FMDatabase alloc] initWithPath:filePath];
        }
        //open 打开数据库;如果数据库文件存在,就直接代开数据库;如果数据库文件不存在,那么先创建数据库,然后再打开
        if ([_db open])
        {
            //设置缓存,提高效率
            [_db setShouldCacheStatements:YES];
            return YES;
        }
        //关闭数据库
        [_db close];
        return NO;
    }
    
    #pragma mark -- 创建表
    + (void)createTable
    {
        //先打开数据库,然后创建表,最后关闭数据库
        if (![DatabaseTool openDatabase])
        {
            return;
        }
        //tableExists 判断表是否存在,当表不存在的时候再去创建  参数:表名
        if (![_db tableExists:@"contact"])
        {
            //executeUpdateWithFormat 对数据库的操作;创建表,增删改都是用这个方法
            [_db executeUpdate:@"CREATE TABLE contact (contact_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone INTEGER)"];
        }
        [_db close];
    }
    
    #pragma mark -- 查询
    + (NSMutableArray *)selectAllContact
    {
        if (![DatabaseTool openDatabase])
        {
            return nil;
        }
        //FMResultSet 结果集
        //executeQueryWithFormat 数据库查询的方法
        FMResultSet *set = [_db executeQuery:@"SELECT * FROM contact"];
        //用来存放查询到的联系人
        NSMutableArray *array = [NSMutableArray array];
        // next 单步查询
        while ([set next])
        {
            //把每一条数据(包含id,name,phone),存入一个对象,再把对象放入数组
            People *p = [[People alloc] init];
            p.contactID = [set intForColumnIndex:0];
            p.name = [set stringForColumn:@"name"];
            p.phone = [set intForColumn:@"phone"];
            //把查询的每一条数据分别放入数组
            [array addObject:p];
            [p release];
        
        ////stringForColumn 根据字段名查询字符串
        //NSString *name = [set stringForColumn:@"name"];
        //int age = [set intForColumn:@"age"];
        ////intForColumnIndex 根据列的索引查询
        //int sid = [set intForColumnIndex:0];
        //NSLog(@"%d---%@---%d",sid,name,age);
        }
        //关闭结果集
        [set close];
        //关闭数据库
        [_db close];
        //把查询的结果返回出去
        return array;
    }
    #pragma mark -- 增加数据
    + (void)inserIntoContact:(People *)p
    {
        if ([DatabaseTool openDatabase])
        {
            //把姓名和电话存入数据库
            [_db executeUpdateWithFormat:@"INSERT INTO contact (name, phone) VALUES (%@,%d)",p.name,p.phone];
            [_db close];
        }
    }
    #pragma mark -- 修改
    + (void)updateContact:(People *)p
    {
        //根据id找到具体的联系人
        if ([DatabaseTool openDatabase])
        {
            [_db executeUpdateWithFormat:@"UPDATE contact SET name = %@, phone = %d WHERE contact_id = %d",p.name,p.phone,p.contactID];
            [_db close];
        }
    }
    #pragma mark -- 删除
    + (void)deleteContact:(int)cid
    {
        if ([DatabaseTool openDatabase])
        {
            //根据联系人的id进行删除
            [_db executeUpdateWithFormat:@"DELETE FROM contact WHERE contact_id = %d",cid];
            [_db close];
        }
    }
    
    @end

    相关文章

      网友评论

        本文标题:FMDB

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