FMDB 使用

FMDB将SQLite API进行了“OC”型封装,使用上方便了很多。
提供了对数据库的增删改查基本功能,以及在多线程并发操作线程安全。
我们简单看一下FMDB:

//FMDatabase:代表一个数据库文件
#import "FMDatabase.h"
//FMResultSet:查询的结果集合
#import "FMResultSet.h"
#import "FMDatabaseAdditions.h"
//用于多线程操作数据库
#import "FMDatabaseQueue.h"
//一种适合只读数据库方式
#import "FMDatabasePool.h"

我们来做一个项目熟悉一下FMDB基本使用。
项目需求:学校-教室-老师-学生 3层数据本地化存储。
使用CocoaPods导入FMDB,我们需要导入libsqlite3.0框架。
首先,我们在沙盒当中创建数据库,习惯用一个单例来创建一个数据库读写对象 NFDbManager :

+ (NFDbManager *)sharedManager
{
    static NFDbManager *sharedAccountManagerInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedAccountManagerInstance = [[self alloc] init];
    });
    return sharedAccountManagerInstance;
}

/**
 *  创建DB对象
 */
- (FMDatabase *)loadDbWishDBName:(NSString *)dbName{
    //沙盒路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory=[paths objectAtIndex:0];
    //dbName:数据库名称
    NSString *writableDBPath=[documentsDirectory stringByAppendingPathComponent:dbName];
    
    NSLog(@"数据库位置-------%@",writableDBPath);
    //创建数据库
    FMDatabase *db = [FMDatabase databaseWithPath:writableDBPath] ;
    
    if (![db open]) {
        NSLog(@"数据库未能创建/打开");
        return nil;
    }
    return db;
}

我们接着创建模型类和控制器类:
分别为教室类NFClassModel:

@property (nonatomic, copy) NSString *schoolName;   //学校名称
@property (nonatomic, copy) NSString *className;    //教室名称

NFTeacherModel:

@property (nonatomic, copy) NSString  * className;
@property (nonatomic, copy) NSString  * teacherName;
@property (nonatomic, copy) NSString  * teacherGender;
@property (nonatomic, copy) NSString  * teacherHeader;
@property (nonatomic, copy) NSString  * teacherAge;
@property (nonatomic, strong) NSArray * studentArray;

学生类NFStudentModel:

@property (nonatomic, copy) NSString  * studentName;
@property (nonatomic, copy) NSString  * studentAge;
@property (nonatomic, copy) NSString  * studentGender;
@property (nonatomic, copy) NSString  * studentHeader;
@property (nonatomic, copy) NSString  * teacherName;

接着我们就根据建立好的模型类来去数据库当中建立我们需要对应的表,我是建立了三张表,一一对应教室,老师和学生:

- (void)initDB:(FMDatabase *)db{

    /**
     *  开启数据库
     */
    if ([db open])
    {
        [db setShouldCacheStatements:YES];
    }
    if(![db tableExists:CLASS_TABLE])//创建教室表
    {
  
        /**
         *  字段:
         id 为主排序
         *   classID    :教室ID
         *   className  :教室名称
         *   classImg   :教室图片
         *   classTotal :数组
         */
    
        BOOL result =  [db executeUpdate:@"create table class_table(_id integer PRIMARY KEY AUTOINCREMENT,"
         "schoolName char(100),className char(100) ,classTotal char(10))"];
        if (result) {
            NSLog(@"教室表创建成功");
        }
    }
    if(![db tableExists:TEACHER_TABLE])//创建老师表
    {
        
        /**
         *  字段:
         id 为主排序
         *   teacherID      :ID
         *   teacherName    :名字
         *   teacherImg     :图片
         *   teacherTotal   :数组
         *   teacherAge     :年龄
         *   teacherGender  :性别
         */
        
        BOOL result =  [db executeUpdate:@"create table teacher_table(_id integer PRIMARY KEY AUTOINCREMENT,"
           "className char(100), teacherName char(100), teacherAge char(100),teacherGender char(100))"];
        if (result) {
            NSLog(@"老师表创建成功");
        }
    }

    if(![db tableExists:STUDENT_TABLE])//创建学生表
    {
        
        /**
         *  字段:
         id 为主排序
         *   studentID       :学生ID
         *   studentName     :学生名称
         *   studentImg      :学生图片
         *   studentAge      :学生年龄
         *   studentGender   :学生性别
         */
        
        BOOL result =  [db executeUpdate:@"create table student_table(_id integer PRIMARY KEY AUTOINCREMENT,"
                        "teacherName char(100), studentName char(100) ,studentAge char (100), studentGender char(10))"];
        if (result) {
            NSLog(@"学生表创建成功");
        }
    } 
}

我们的表建好了,那么我们就在NFDbManager当中公开几个方法,让我们来操作对应的表:

/**
 *  插入教室
 */
- (BOOL)insertClass:(NFClassModel *)classModel;
/**
 *  插入老师
 */
- (BOOL)insertTeacher:(NFTeacherModel *)teacher;
/**
 *  插入学生
 */
- (BOOL)insertStudent:(NFStudentModel *)student;
/**
 *  查询学校下面所有的教室
 */
- (NSArray *)querySubjectWithSchoolName:(NSString *)schoolName;
/**
 *  查询教室下面的所有老师
 */
- (NSArray *)querySubjectWithClassName:(NSString *)className;
/**
 *  查询老师下面的所有学生
 */
- (NSArray *)querySubjectWithTeacherName:(NSString *)teacherName;

FMDB提供了增删改查语句:
有这么一点:一切不是SELECT命令的命令都视为更新,这包括 CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等。
我们就拿插入一个学生信息为例子吧:

/**
 *  插入学生
 */
- (BOOL)insertStudent:(NFStudentModel *)student{

    //判断是否打开
    if ([nfDB open]) {
         
    if (![self existsWithObjcet:student WishType:3])
    {
        NSLog(@"插入成功 " );
       //?:占位符  执行语句不区分大小写
        return [nfDB executeUpdate:[self setTable2:@"insert into %@ (teacherName,studentName ,studentAge,studentGender) values(?,?,?,?)"],
                student.teacherName,
                student.studentName,
                student.studentAge,
                student.studentGender
                ];
        
    }
        //插入之后关闭
    [nfDB close];
     }
    return NO;
}

同样的方法,我们插入更多数据。
当我们需要查询的时候,FMResultSet为我们提供了不同的数据格式读取:

intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:

我们再一次查询当前老师名称下的所有学生数组:

/**
 *  查询老师下面的所有学生
 */
- (NSArray *)querySubjectWithTeacherName:(NSString *)teacherName{
    
    NSMutableArray *array =[[NSMutableArray alloc] init];
    FMResultSet *rs;
    //查询结果集合
    rs = [nfDB executeQuery:[self setTable2:@"select * from %@ where teacherName = ?  "],teacherName];
    //遍历集合
    while ([rs next]) {
        NFStudentModel *studentModel = [[NFStudentModel alloc]init];
        
        studentModel.studentName = [rs stringForColumn:@"studentName"];
         studentModel.studentAge = [rs stringForColumn:@"studentAge"];
         studentModel.studentGender = [rs stringForColumn:@"studentGender"];
        
        [array addObject:studentModel];
    }
    
    return array;
}

FMDM还有很多功能可以供我们使用,以后有机会会继续写一些其他功能,供童鞋们学习。
效果:


屏幕快照 2016-03-20 下午11.21.25.png
屏幕快照 2016-03-20 下午11.21.34.png
屏幕快照 2016-03-20 下午11.21.42.png
屏幕快照 2016-03-20 下午11.17.37.png
屏幕快照 2016-03-20 下午11.42.50.png
屏幕快照 2016-03-20 下午11.42.54.png
屏幕快照 2016-03-20 下午11.42.59.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 框架地址:[https://github.com/ccgus/fmdb] 下载框架Snip20160912_6.p...
    coder_hong阅读 1,352评论 0 2
  • 在网上查过一些资料,感觉都千篇一律,不过也加深了自己对FMDB的认识,同时也能了解到作者对FMDB理解的深浅。当然...
    FlowYourHeart阅读 409评论 0 0
  • 祛湿的两大方法是:一、增加体表的排汗;二、提高人体对水的利用率。 关系到水在人体中的运化率的三大内脏是:肾、脾、肺...
    曾晨风阅读 3,640评论 1 1
  • 一直很喜欢黑白这种很简单的色调,但自己没怎么拍过,今天和朋友散步,忽然发现拍的照片加上黑白滤镜很好看,于是就拍了一小组。
    易尘歌阅读 119评论 0 3
  • 怀友 山寒日暮秋风尽,细看枝头落叶沉。 共话枯荣君未在,来年恐叹绿无痕。
    挤酱斯基阅读 214评论 0 5