FMDB - 数据库操作

iOS-FMDB数据库操作指南:从入门到实践 在iOS应用开发中,SQLite作为轻量级的关系型数据库,常被用来处理本地数据存储。然而,原生的SQLite API在使用时存在一定的复杂性,尤其是对开发者来说,需要手动管理数据库的连接、错误处理、以及多线程下的数据同步等问题。这样不仅增加了代码的复杂度,还可能引入内存泄漏、线程安全等问题,影响了应用的性能和稳定性。 阅读详情

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。

在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包。


FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。

FMDB常用类:

FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
FMResultSet :执行查询一个FMDatabase结果集,这个和 Android 的Cursor类似。
FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。

创建数据库:

db = [FMDatabase databaseWithPath:database_path];  

 1、当数据库文件不存在时,fmdb会自己创建一个。

 2、 如果你传入的参数是空串:@"" ,则fmdb会在临时文件目录下创建这个数据库,数据库断开连接时,数据库文件被删除。

3、如果你传入的参数是 NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。


打开数据库:

[db open]  
返回BOOL型。


关闭数据库:

[db close]

数据库增删改等操作:

除了查询操作,FMDB数据库操作都执行 executeUpdate方法,这个方法返回BOOL型。


 

看一下例子:

创建表:

    if ([db open]) {  
        NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];  
        BOOL res = [db executeUpdate:sqlCreateTable];  
        if (!res) {  
            NSLog(@"error when creating db table");  
        } else {  
            NSLog(@"success to creating db table");  
        }  
        [db close];  
  
    } 

添加数据:

if ([db open]) {  
       NSString *insertSql1= [NSString stringWithFormat:  
                              @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
                              TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];  
       BOOL res = [db executeUpdate:insertSql1];  
       NSString *insertSql2 = [NSString stringWithFormat:  
                               @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",  
                               TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];  
       BOOL res2 = [db executeUpdate:insertSql2];  
         
       if (!res) {  
           NSLog(@"error when insert db table");  
       } else {  
           NSLog(@"success to insert db table");  
       }  
       [db close];  
  
   } 

修改数据:

if ([db open]) {  
        NSString *updateSql = [NSString stringWithFormat:  
                               @"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",  
                               TABLENAME,   AGE,  @"15" ,AGE,  @"13"];  
        BOOL res = [db executeUpdate:updateSql];  
        if (!res) {  
            NSLog(@"error when update db table");  
        } else {  
            NSLog(@"success to update db table");  
        }  
        [db close];  
  
    } 

删除数据:

if ([db open]) {  
          
        NSString *deleteSql = [NSString stringWithFormat:  
                               @"delete from %@ where %@ = '%@'",  
                               TABLENAME, NAME, @"张三"];  
        BOOL res = [db executeUpdate:deleteSql];  
          
        if (!res) {  
            NSLog(@"error when delete db table");  
        } else {  
            NSLog(@"success to delete db table");  
        }  
        [db close];  
  
    }  

数据库查询操作:

查询操作使用了 executeQuery,并涉及到 FMResultSet。

if ([db open]) {  
        NSString * sql = [NSString stringWithFormat:  
                          @"SELECT * FROM %@",TABLENAME];  
        FMResultSet * rs = [db executeQuery:sql];  
        while ([rs next]) {  
            int Id = [rs intForColumn:ID];  
            NSString * name = [rs stringForColumn:NAME];  
            NSString * age = [rs stringForColumn:AGE];  
            NSString * address = [rs stringForColumn:ADDRESS];  
            NSLog(@"id = %d, name = %@, age = %@  address = %@", Id, name, age, address);  
        }  
        [db close];  
    }  

FMDB的FMResultSet提供了多个方法来获取不同类型的数据:



数据库多线程操作:

 如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue, 使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理。


FMDatabaseQueue * queue = [FMDatabaseQueue databaseQueueWithPath:database_path];  
   dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);  
   dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);  
     
   dispatch_async(q1, ^{  
       for (int i = 0; i < 50; ++i) {  
           [queue inDatabase:^(FMDatabase *db2) {  
                 
               NSString *insertSql1= [NSString stringWithFormat:  
                                      @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",  
                                      TABLENAME, NAME, AGE, ADDRESS];  
                 
               NSString * name = [NSString stringWithFormat:@"jack %d", i];  
               NSString * age = [NSString stringWithFormat:@"%d", 10+i];  
                 
                 
               BOOL res = [db2 executeUpdate:insertSql1, name, age,@"济南"];  
               if (!res) {  
                   NSLog(@"error to inster data: %@", name);  
               } else {  
                   NSLog(@"succ to inster data: %@", name);  
               }  
           }];  
       }  
   });  
     
   dispatch_async(q2, ^{  
       for (int i = 0; i < 50; ++i) {  
           [queue inDatabase:^(FMDatabase *db2) {  
               NSString *insertSql2= [NSString stringWithFormat:  
                                      @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",  
                                      TABLENAME, NAME, AGE, ADDRESS];  
                 
               NSString * name = [NSString stringWithFormat:@"lilei %d", i];  
               NSString * age = [NSString stringWithFormat:@"%d", 10+i];  
                 
               BOOL res = [db2 executeUpdate:insertSql2, name, age,@"北京"];  
               if (!res) {  
                   NSLog(@"error to inster data: %@", name);  
               } else {  
                   NSLog(@"succ to inster data: %@", name);  
               }  
           }];  
       }  
   });  


demo下载



转载原文 :http://blog.youkuaiyun.com/xyz_lmn/article/details/9312837 




iOS-基于FMDB的操作封装,模型对象的增删改查 iOS-基于FMDB的操作封装,模型对象的增删改查 详细使用介绍请参考:http://blog.youkuaiyun.com/u014220518/article/details/78189927 立即下载

相关推荐

STC8单片机低功耗延时优化实践:从循环等待到定时唤醒

本文深入探讨了STC8单片机低功耗延时优化的核心方法,即利用掉电唤醒定时器(WKT)替代传统的循环等待,实现从“空转耗电”到“定时唤醒”的转变。通过实战代码演示了如何编写低功耗延时函数,将待机电流从mA级降至μA级,并分析了精度、唤醒时间等关键权衡点,为电池供电的物联网设备提供了有效的续航优化方案。

pea55的博客 324

iOS学习笔记(十六)——数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。 在FMDB下载文件后,工...

923723914 379

禅道二次开发(一):从零搭建本地开发与调试环境

本文详细介绍了禅道二次开发的第一步:从零搭建本地开发与调试环境。通过部署官方一键安装包、配置端口与防火墙、连接数据库、设置Samba文件共享,并最终在VSCode中配置PHP智能感知与Xdebug调试,手把手教你建立一个隔离、高效的专属开发工作台,为后续的代码修改与功能扩展奠定坚实基础。

weixin_29003437的博客 320

iOS FMDB小结

作为iOS传统的数据库封装工具库FMDB,大家都很熟悉,原来也用过,主要没有系统的总结,这次总结一下吧,其实是看了好几篇别人的日志然后自己再加工了一下。 首先是库的导入有两种选择 1 从gitHub上下载 https://github.com/ccgus/fmdb  然后导入系统库 libSqlite3.tbd 2 pod上面下载  pod 'FMDB' 然后是使用 数据库最基本

rpf的博客 530

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

产品经理必看!用Cursor自动生成符合开发规范的技术文档(含UI设计规则模板)

本文详细介绍了产品经理如何利用Cursor工具自动生成符合开发规范的技术文档,并整合UI设计规则模板。通过配置标准化文档结构和设计关联规则,Cursor能有效解决术语不统一、结构混乱等问题,提升跨团队协作效率。文章包含实际案例、规则配置要点及企业级实施方案,帮助产品经理快速掌握AI辅助文档生成技巧。

emacs5lisp的博客 219

FMDB 在多线程中的使用

在App中保持一个FMDatabaseQueue的实例,并在所有的线程中都只使用这一个实例。[FMDatabaseQueue databaseQueueWithPath:path]FMDatabaseQueue虽然看似一个队列,实际上它本身并不是,它通过内部创建一个Serial的dispatch_queue_t来处理通过inDatabase和inTransaction传入的Blocks

Bannings的专栏 2万+

基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

watch361的博客 1万+

FMDB 的封装与使用

FMDB 的封装与使用

Hanyang Li的专栏 1142

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2583

第三方框架FMDB

在iPhone上是采用sqlite进行数据存储是我一种比较习惯性的做法。一般在其他平台也比较习惯用sqlite,比如android。 而iphone上有一些封装好的第三方框架提供使用,更节省了许多时间。如:Sqlitepersistentobjects ,FMDB。今天查找了这个两个框架,感觉FMDB的风格更符合我的使用,其实两者是各有优点的,只是看个人喜好而已。 以下是FMDB的一些

ArgentinaNo10的博客 660

Python画柱状图(双柱状图,三柱状图)且显示对应数值

使用python实现双柱状图和三柱状图,并且在柱状图形的顶部显示对应数值;

yue200403的博客 1万+

数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。 在FMDB下载文件

Fly的技术博客 1277

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

iOS数据库操作之FMDB

SQLite一种轻量级关系数据库,在嵌入式系统中使用比较广泛。 在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import  FMDB对sqlit接口进行了高级封装,使用上更加友好简洁。 https://github.com/ccgus/fmdb FMDB包含以下文件: FMDatabase.h FMDatabase.m FMData

开发者说 1744

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS开发中使用FMDB的网文iOS 使用FMDB进行数据库操作

http://www.cnblogs.com/wuhenke/archive/2012/02/07/2341656.html

thanklife的专栏 1089

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

iOS——使用FMDB进行数据库操作(转载)

iOS 使用FMDB进行数据库操作 https://github.com/ccgus/fmdb [摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考。 FMDB 使用方法 ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。 使用 在 FMDB 中有三个重要的类: FM...

Watchmen0320的博客 212

iOS 使用FMDB进行数据库操作

[摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考。 1、首先要先导入第三方类库FMdatabase。 2、获得存放数据库文件的沙盒地址。 View Row Code 1 +(NSString *)databaseFilePath 2 { 3 4 NSArray

hengshujiyi的专栏 1万+

iOS学习笔记(十六)——数据库操作 使用FMDB

iOS学习笔记(十六)——数据库操作 使用FMDB

ytfghytf的博客 240

【ios开发】使用FMDB封装类的sqlite数据库操作

今天第一次学习FMDB,实现了增删查改,列几个例子供大家参考创建,插入,更新和删除:使用executeUpdate方法,而查询则用executeQuery 1.实例化FMDatabase//paths: ios下Document路径,Document为ios中可读写的文件夹NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDo...

diezhi9415的博客 211

iOS 数据库操作(使用FMDB)

iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封...

weixin_30555753的博客 78

数据库操作FMDB

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单介绍下FMDB的使用。 在FMDB下载文件后,工程

huzhaohao的专栏 457
上一篇: 搭建APP框架
下一篇: Category - 使用
喵星人Xcode
博客等级 码龄11年 235粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值