iOS FMDB Sqlite

第三方操作数据库sqlite的类库 FMDB 简化对sqlite的操作,更加方便我们的开发,使用起来简单。 立即下载

SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特别麻烦也不利于理解和使用,在之前的http://blog.youkuaiyun.com/tangren03/article/details/7781930文章中就是使用IOS的SDK自带的SQLite API来使用数据库,感觉使用很不方便,今天就讲讲一个针对IOS的SQlite API封装的第三方库FMDB,FMDB对SDK中的API做了一层封装,使之使用OC来访问,使用方便而且更熟悉。FMDB的下载地址https://github.com/ccgus/fmdb。


FMDB主要涉及两个类,FMDatabase和FMResultSet,前者类似于Android中的SQLiteOpenHelper或SQLiteDatabase,FMResultSet类似于Android中的Cursor,用来存储结果集。

下载完FMDB源码后把文件拖到工程中,并导入SQLite支持库,工程目录如下:

                                                    

然后就是这个Demo的完整截图:

                                            

然后就来看看如何操作FMDB:

[cpp]  view plain copy
  1. //点击按钮后执行保存到数据库的操作  
  2. - (IBAction)saveButtonClicked:(id)sender {  
  3.     //获取Document文件夹下的数据库文件,没有则创建  
  4.     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     //获取数据库并打开  
  8.     FMDatabase *database  = [FMDatabase databaseWithPath:dbPath];  
  9.     if (![database open]) {  
  10.         NSLog(@"Open database failed");  
  11.         return;  
  12.     }  
  13.       
  14.     //创建表(FMDB中只有update和query操作,出了查询其他都是update操作)  
  15.     [database executeUpdate:@"create table user (name text,gender text,age integer)"];  
  16.       
  17.     //插入数据  
  18.     BOOL insert = [database executeUpdate:@"insert into user values (?,?,?)",nameTextField.text,genderTextField.text,ageTextField.text];  
  19.       
  20.     if (insert) {  
  21.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"保存成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];  
  22.         [alert show];  
  23.         [alert release];  
  24.     }  
  25.       
  26.     [database close];  
  27. }  

操作成功后弹出提示框:

                                             

[cpp]  view plain copy
  1. //点击按钮后执行查询操作  
  2. - (IBAction)queryButtonTapped:(id)sender {  
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.     NSString *documentPath = [paths objectAtIndex:0];  
  5.     NSString *dbPath = [documentPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabase *database = [FMDatabase databaseWithPath:dbPath];  
  8.     if (![database open]) {  
  9.         return;  
  10.     }  
  11.       
  12.     //不需要像Android中那样关闭Cursor关闭FMResultSet,因为相关的数据库关闭时,FMResultSet也会被自动关闭  
  13.     FMResultSet *resultSet = [database executeQuery:@"select * from user"];  
  14.     while ([resultSet next]) {  
  15.         NSString *name = [resultSet stringForColumn:@"name"];  
  16.         NSString *gender = [resultSet stringForColumn:@"gender"];  
  17.         int age = [resultSet intForColumn:@"age"];  
  18.         NSLog(@"Name:%@,Gender:%@,Age:%d",name,gender,age);  
  19.           
  20.     }  
  21.       
  22.     [database close];  
  23.     //这里也不需要release  
  24. //    [database release];  
  25. }  

FMResultSet还支持以下方式获取值:

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

[cpp]  view plain copy
  1. //执行条件查询操作  
  2. - (IBAction)queryByConditionBtnTapped:(id)sender {  
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.     NSString *docPath = [paths objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabase *database = [FMDatabase databaseWithPath:dbPath];  
  8.     if (![database open]) {  
  9.         return;  
  10.     }  
  11.       
  12.     FMResultSet *resultSet = [database executeQuery:@"select * from user where name = ?",@"Ryan"];  
  13.     while ([resultSet next]) {  
  14.         NSString *name = [resultSet stringForColumn:@"name"];  
  15.         NSString *gender = [resultSet stringForColumn:@"gender"];  
  16.         int age = [resultSet intForColumn:@"age"];  
  17.         NSLog(@"Name:%@,Gender:%@,Age:%d",name,gender,age);  
  18.     }  
  19.       
  20.     [database close];  
  21. }  


[cpp]  view plain copy
  1. //执行更新操作  
  2. - (IBAction)updateBtnTapped:(id)sender {  
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.     NSString *docPath = [paths objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabase *database = [FMDatabase databaseWithPath:dbPath];  
  8.     if (![database open]) {  
  9.         return;  
  10.     }  
  11.       
  12.     //参数必须是NSObject的子类,int,double,bool这种基本类型,需要封装成对应的包装类才可以  
  13.     BOOL update = [database executeUpdate:@"update user set name = ? where age = ?",@"RyanTang",[NSNumber numberWithInt:24]];  
  14.   
  15.     if(update){  
  16.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"更新成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];  
  17.         [alert show];  
  18.         [alert release];  
  19.     }  
  20.   
  21.     [database close];  
  22. }  

                                       

[cpp]  view plain copy
  1. //执行删除操作  
  2. - (IBAction)deleteBtnTapped:(id)sender {  
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.     NSString *docPath = [paths objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabase *database = [FMDatabase databaseWithPath:dbPath];  
  8.     if (![database open]) {  
  9.         return;  
  10.     }  
  11.   
  12.     BOOL delete = [database executeUpdate:@"delete from user where name = ?",@"Tang"];  
  13.     if (delete) {  
  14.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"删除成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];  
  15.         [alert show];  
  16.         [alert release];  
  17.   
  18.     }  
  19.       
  20.     [database close];  
  21. }  

                                       

如果我们的app需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。

     使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。

 

[cpp]  view plain copy
  1. -(void)executeDBOperation  
  2. {  
  3.     //获取Document文件夹下的数据库文件,没有则创建  
  4.     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabaseQueue *databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];  
  8.     [databaseQueue inDatabase:^(FMDatabase *db){  
  9.     [db executeUpdate:@"insert into user values (?,?,?)",@"Ren",@"Male",[NSNumber numberWithInt:20]];  
  10.     }];  
  11.     [databaseQueue close];  
  12. }  


工程源码:下载


加入我们的QQ群或微信公众账号请查看: Ryan's zone公众账号及QQ群


欢迎关注我的新浪微博和我交流:@唐韧_Ryan

一个响应ping包延迟偏大的问题 前段时间客户反馈一个使用pc上的命令行ping无线设备(WiFi4)时,设备平均响应时间(测试时长2小时,1秒Ping一次)相比其它机型偏慢的问题,并上传上具体的时间的Log.从log中看到,大多数包的响应还是比较快的,只是个别响应时间较长,且响应时间长的包时间几乎都是一样的100多ms.如下是部分响应时间截图. 整个2小时的测试时间里,总是时不时的出这么上102,104ms的响应时间,这直接导致了平均响应时间被拉大.于是本地测试,也发现了类似的延迟.本地测试时,现象略有... 阅读详情

相关推荐

PADS导出PCB正反面丝印为CAD文件的方法

本文介绍如何将PADS绘制的pcb格式的PCB文件顶底层丝印及板框导出为CAD的dxf文件格式,并且将底层丝印进行镜像为正常视角

luguodeyo的博客 3292

IOS学习笔记28—SQLite3第三方库之FMDB

SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特别麻烦也不利于理解和使用,在之前的http://blog.youkuaiyun.com/tangren03/article/details/7781930文章中就是使用IOS的SDK自带的S

Secret Island 2185

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

在工程中使用SQLite3

#include //包含SQLite3头文件#include "sqlite3.h"//连接sqlite3库文件#pragma comment(lib,"sqlite3.lib") int main( int argc, char* argv[] ){     int nRet;      sqlite3 *db=NULL;     nRet = sq

K·A 755

别再只用固定线了!聊聊Android车机‘快速倒车’与‘正常倒车’的UI与数据流核心差异(附动态轨迹线实现原理)

本文深度解析Android车机中快速倒车与正常倒车的核心差异,探讨从内核级视频流水线到动态轨迹线的技术实现。快速倒车通过内核直接操作FrameBuffer实现2秒内响应,而正常倒车则支持多传感器数据融合与动态UI元素。文章还分享了动态轨迹线的算法实现与性能优化技巧,帮助开发者打造极致的倒车体验。

weixin_42550597的博客 253

避坑指南:Vue调用摄像头常见6大报错解决方案(navigator.mediaDevices全兼容方案)

本文深入剖析了在Vue应用中调用摄像头时常见的六大报错,如权限拒绝、设备未找到等,并提供了基于navigator.mediaDevices的全兼容解决方案。内容涵盖从HTTPS环境配置、浏览器兼容性处理到摄像头资源管理与高级错误处理,旨在帮助开发者构建稳定可靠的企业级摄像头应用。

Black的专栏 338

electron打包更新与集成sqlite小总结

本文主要讲以下几点 简单介绍electron electron的进程与渲染层通讯 electron的打包配置 electron的自动更新 electron如何集成sqlite3 electron的资料分享 electron在内网开发的一点点建议 electron主进程的生命周期 快速开始一个electron与简介 electron是什么 打开官网第一眼就是使用 JavaScript, HTML...

weixin_34049948的博客 3006

手把手教你用ZEMAX复现贝塞尔光束:从Thorlabs锥透镜到Edmund透镜的完整光路搭建

本文详细介绍了如何在ZEMAX光学设计软件中复现贝塞尔光束,从Thorlabs锥透镜到Edmund透镜的完整光路搭建过程。通过逐步指导,帮助研究人员和工程师掌握光学设计技巧,实现无衍射特性的贝塞尔光束生成,适用于激光加工和生物成像等领域。

weixin_33737774的博客 176

IOS常用的第三方库(框架)

文章目录AFNetworkingReactiveCocoaSDWebImageEurekaRealm AFNetworking ReactiveCocoa SDWebImage Eureka 【iOS】Eureka的基本使用和自定义Cell Realm

baidu_40537062的博客 2867

OpenCV图像拼接实战:用SIFT+透视变换打造无缝全景图(附完整代码)

本文详细介绍了使用OpenCV和SIFT算法实现图像拼接的全过程,包括特征匹配、透视变换和高级融合技术。通过实战代码演示,帮助开发者掌握无缝全景图生成的核心技术,适用于旅行摄影、无人机航拍等多种场景。

eee77的博客 997

新凯来嵌入式面经及参考答案

利用编译器预定义宏判断目标架构,如。

大模型大数据攻城狮的专栏 2065

iPhone应用数据存储Sqlite3第三方框架FMDB

iPhone应用数据存储Sqlite3第三方框架FMDB是本文要介绍的内容,在iPhone上是采用sqlite进行数据存储是我一种比较习惯性的做法。一般在其他平台也比较习惯用sqlite,比如android。 而iphone上有一些封装好的第三方框架提供使用,更节省了许多时间。如:Sqlitepersistentobjects ,FMDB。今天查找了这个两个框架,感觉FMDB的风格更...

anziji4025的博客 234

黑猫带你学eMMC协议第4篇:eMMC概述

1 前言 声明: 本文依据eMMC JEDEC5.1协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 本文大约3000字,从emmc的内部结构框架、供电、总线、寄存器等各方面进行框架性的介绍,本章节内容不需要深入研究,读完本篇文章,只要能对emmc有个框架下的了解,就可以了。 2 内部结构框架 由图可以看出,emmc内部由两块组成:控制器 + 存储介质。emmc内部存储介质绝大部分为nand flash。 众所周知,我们需要存储数据到nand flash中,并

黑猫奥利奥的博客 3340

iOS之sqlite和FMDB

数据库sqlite在iOS中起着举足轻重的作用,本文主要讲述一下sqlite的并发,事务和常见的损坏问题,后面会简述一下对sqlite进一步封装的第三方库FMDB。 sqlite的并发和事务 在了解sqlite的事务和并发之前,我们要先了解sqlite提供的几种锁的类型及区别。sqlite提供了五种级别的锁: UNLOCKED(未锁定):当前数据库不存在读写操作。为默认状态。 SHARE

ma524654165的博客 282

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ios(六)sqlite3以及FMDB

SQLite:一种轻量的本地数据库,方便嵌入系统,支持跨平台,根据工作经验来看,无论是Android还是iOS大多都采用SQLite 首先我们需要新建一个数据库,我们给他起名personinfo.sqlite,创建一张叫做person的表,里面有三个字段 name,age,sex。数据库存放在iOS的沙盒文件Document目录下, #define DBName @"personinfo.sq

u012723810的博客 436

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ios学习--sqlite 操作工具 FMDB

這次要分享的是在iOS中使用SQLite。其實我對SQLite一點概念都沒有,因為一直沒有機會使用它。有時候突然想到,就會找幾本手邊的工具書或在網路上找尋在iOS中使用SQLite的教學。但是每次學,每次失敗,讓我愈來愈討厭SQLite 囧。直到有一次在網路上發現了FMDB這個東西,才發現不是SQLite很難學,而是SQLite的C API對初學者來說實在太麻煩太瑣碎,難度太高,難怪我怎麼學都學不

yanfangjin的专栏 2941

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【iOS】使用SQLite与FMDB

iOS中的SQLite与Android中的一模一样,只是调用方法有差异。如果单从调用来讲,Android封装的一套helper更好用一些,而iOS原生的用C语言的几个函数在操作,比较麻烦。不过引入第三方框架FMDB,使用起来就方便很多。 一、SQLite的基本使用 使用步骤: 1.导入系统框架(C语言). (libsqlite3) 2.头文件#importsqlite3.h>. 3.

xn4545945 7330

iOS FMDB操作sqlite数据库

一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.

司马懿的西山居 3329

iOS使用sqlite3原生语法进行增删改查以及FMDB的使用

首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去。 一种方法是从外面拷贝到程序里:http://www.cnblogs.com/Steak/p/3764395.html 另一种方法就是直接创建表,既然是操纵数据库,那么一定有一个数据库对象,sqlite是C库,所以需要一个C变量: ...

diangou2756的博客 135

mysql和sqlite3 ios_iOS-SQLite3和FMDB使用

1 SQLite31> SQLite的语法管理工具:Navicat数据类型{text字段integer数字real浮点bolb二进制可以完整保存数据,例如照片}ddl(结构定义CREATEALTERDROP){CREATECREATETABLE表的名字(每个字段的定义字段名数据类型...)CREATETABLEt_cjb(xiaomin...

weixin_33518100的博客 255

FMDB: 一款强大的 iOS 和 macOS 上的 SQLite 数据库框架

FMDB 是一个开源的、轻量级的、易于使用的 Objective-C 库,它为 iOS 和 macOS 开发者提供了访问 SQLite 数据库的功能。通过 FMDB,你可以轻松地执行 SQL 查询语句、管理数据库事务、处理结果集等操作。 ## 功能特性 1. **SQL 查询支持**:FMDB 支持执行标准的 SQL 查询语句,并提供 API 对查询结果进行迭代和解析。 2. **事务处理...

gitblog_00002的博客 667

Persisting iOS Application Data in SQLite Database Using FMDB

In previous articles we have utilized NSUserDefaults and .NET web services to persist iPhone data. NSUserDefaults is idol for storing small amounts of data. Web services are used to store the dat...

184

iOS SQLite、CoreData、FMDB数据库详解

在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库。例如前面IOS开发系列—Objective-C之Foundation框架的文章中提到归档、plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录。当然,文件存储并不作为本文的重点内容

li唱的专栏 3914

iOS基础——数据操作之Sqlite3、FMDB

iOS基础——数据操作之Sqlite3、FMDB前言 iOS数据库操作可分为Sqlite3、CoreData、FMDB第三方库 sqlite3在不使用的时候需要close,在需要的使用的时候重新open 一、Sqlite3数据库操作无非就是Sql语句的书写,最常见的就是增删改查,通过Sqlite3实现我们简单的数据存储1、导入Sqlite3依赖库在项目的设置文件中找到Link Binary With

点击置顶文章查看博客目录(全站式导航) 1525

iOS—SQLite 3封装库FMDB

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

victorai60的专栏 434
上一篇: superMap iMobile for iOS 使用代码在地图上画一条线
下一篇: sqlite加密-SQLCipher
Triple_Vip
博客等级 码龄15年 135粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值