http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4849|回复: 6

[相关工具] FMDB介绍和使用

[复制链接]
发表于 2018-12-14 11:01:05 | 显示全部楼层 |阅读模式
本帖最后由 竹林风 于 2018-12-14 11:46 编辑

介绍


FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API


优点


  • 使用起来更加面向对象,省去了很多麻烦,冗余的C语言代码
  • 对比苹果自带的Core Data框架,更加轻量级和灵活
  • 提供了多线程安全的数据库操作方法,有效的防止数据混乱


下载地址


https://github.com/ccgus/fmdb




FMDB核心类

1.FMDatabase  (一个FMDatabase对象就代表一个单独的SQLite数据库  用来执行SQL语句)
2.FMResultSet  (使用FMDatabase执行查询后的结果集)
3.FMDatabaseQueue (用于在多线程中执行多个查询或更新,它是线程安全的)

使用

这里我用原生写的Demo进行改造

1.打开或创建数据库

[Objective-C] 纯文本查看 复制代码
- (void)openSqlite{
    
    //1.打开数据库(如果指定的数据库文件存在就直接打开,不存在就创建一个新的数据文件)
    //参数1:需要打开的数据库文件路径(iOS中一般将数据库文件放到沙盒目录下的Documents下)
    NSString *nsPath = [NSString stringWithFormat:@"%@/Documents/Person.db", NSHomeDirectory()];
//    const char *path = [nsPath UTF8String];
    NSLog(@"sqlite path == %@",nsPath);
    //参数2:指向数据库变量的指针的地址
    //返回值:数据库操作结果
    //2.获得数据库
     FMDatabase *dbs=[FMDatabase databaseWithPath:nsPath];
    
    //判断执行结果
    if ([dbs open]) {
        NSLog(@"打开数据库成功");
        
    }else{
        NSLog(@"打开数据库失败");
    }
    if (!db) {
        db = dbs;
    }
    
    if (![self isExistTable:@"student"]) {
        [self creatTable];
    }
    
}


2.创建表

[Objective-C] 纯文本查看 复制代码
/**
 判断一张表是否已经存在
 @param tablename 表名
 */
- (BOOL)isExistTable:(NSString *)tablename{
    NSString *sql = [NSString stringWithFormat:@"SELECT COUNT(*) FROM sqlite_master where type= 'table' and name= '%@';",tablename];
    FMResultSet *rs = [db executeQuery:sql];
//    BOOL result = [db executeQuery:sql];
    while ([rs next]) {
        NSInteger count = [rs intForColumnIndex:0];
        if (count == 0) {
            return NO;
        }else {
            return YES;
        }
    }
    return NO;
}

- (void)creatTable{
    //1.设计创建表的sql语句
    NSString * sql = @"CREATE TABLE IF NOT EXISTS student(ID INTEGER PRIMARY KEY AUTOINCREMENT, num integer,name 'text', 'sex' 'text','age' integer);";
    
    BOOL result = [db executeUpdate:sql];
    
//    int ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
    
    //3.判断执行结果
    if (result) {
        NSLog(@"创建表成功");
    }else{
        NSLog(@"创建表失败");
    }
}


3.添加一条数据

[Objective-C] 纯文本查看 复制代码
//添加数据
- (void)addStudent:(Student *)stu {
    
    //操作之前先打开数据库
    if (![db open]) {
        [self openSqlite];
    }
    
    //1.准备sqlite语句
    NSString *sqlite = [NSString stringWithFormat:@"insert into student(num,name,age,sex) values (%@,'%@','%@','%@')",@(stu.num),stu.name,@(stu.age),stu.sex];
    //2.执行sqlite语句
    //    char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
    BOOL result = [db executeUpdate:sqlite];
    if (result) {
        NSLog(@"添加数据成功");
    } else {
        NSLog(@"添加数据失败");
    }
    
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
}


4.更新一条数据

[Objective-C] 纯文本查看 复制代码
//修改数据
- (void)updataWithStu:(Student *)stu {
    
    //操作之前先打开数据库
    if ([db open]) {
        //1.sqlite语句
        NSString *sqlite = [NSString stringWithFormat:@"update student set name = '%@',sex = '%@',age = '%ld' where num = '%ld'",stu.name,stu.sex,stu.age,stu.num];
        //2.执行sqlite语句
        BOOL result = [db executeUpdate:sqlite];
        if (result) {
            NSLog(@"修改数据成功");
        } else {
            NSLog(@"修改数据失败");
        }
        
        //    结束之后要记得关闭: 这一点很重要
        [self closeSqlite];
    }
}


5.删除一条数据

[Objective-C] 纯文本查看 复制代码
//删除数据
- (void)delete:(Student*)stu {
    
    //操作之前先打开数据库
    if (![db open]) {
        [self openSqlite];
    }
    
    //1.准备sqlite语句
    NSString *sqlite = [NSString stringWithFormat:@"delete from student where num = '%ld'",stu.num];
    //2.执行sqlite语句
    BOOL result = [db executeUpdate:sqlite];
    if (result) {
        NSLog(@"删除数据成功");
    } else {
        NSLog(@"删除数据失败");
    }
    
    //    结束之后要记得关闭: 这一点很重要
    [self closeSqlite];
    
}


6.查询数据

[Objective-C] 纯文本查看 复制代码
//查询所有数据
- (NSMutableArray*)selecAllStudent {
    
    if (![db open]) {
        [self openSqlite];
    }
    NSMutableArray *array = [[NSMutableArray alloc] init];
    FMResultSet *rs = [db executeQuery:@"select * from student"];
    // 遍历结果集
    while ([rs next]) {
        Student *stu = [[Student alloc] init];
        stu.num = [rs intForColumn:@"num"];
        stu.name = [rs stringForColumn:@"name"];
        stu.age = [rs intForColumn:@"age"];
        stu.sex = [rs stringForColumn:@"sex"];
        [array addObject:stu];
    }
    [rs close];
    [self closeSqlite];
    return array;
}


7.关闭数据库

[Objective-C] 纯文本查看 复制代码
#pragma mark - 4.关闭数据库
- (void)closeSqlite {
    
    BOOL result = [db close];
    if (result) {
        NSLog(@"数据库关闭成功");
    } else {
        NSLog(@"数据库关闭失败");
    }
}


效果还是和Demo 的一样。
附件: Test-FMDB.zip (255.99 KB, 下载次数: 3)


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-12-14 11:14:07 | 显示全部楼层
我只是路过打酱油的。
 楼主| 发表于 2018-12-14 11:47:07 | 显示全部楼层
如果项目中有需要用到数据库的话,个人首选肯定是FMDB
发表于 2018-12-14 14:50:21 | 显示全部楼层
感恩无私的分享与奉献
发表于 2018-12-14 15:19:59 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2018-12-14 17:14:45 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-15 14:00:25 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 11:31

© 2014-2021

快速回复 返回顶部 返回列表