为什么80%的码农都做不了架构师?>>>   

http://note.sdo.com/u/3413430/NoteContent/d1mS~k158MiwE0c400eTi

SQLite的C API對初學者來說實在太麻煩太瑣碎,難度太高。FMDB ( FMDatabase ) 說穿了其實只是把C API包裝成簡單易用的Objective-C类。對于SQLite初學者來說,大大減低了上手的難度。有了FMDB,寫程式時只要專心在SQLite的語法上,而不用去理那堆有看沒有懂的C API,實在是件快樂的事情。

-打开/关闭资料库

使用资料库的第一件事,就是建立一个资料库。要注意的是, 在iOS环境下,只有document directory 是可以进行读写的。在写程式时用的那个Resource资料夹底下的东西都是read-only。因此,建立的资料库要放在document 资料夹下。方法如下:

1 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2 NSString *documentDirectory = [paths objectAtIndex:0];
3 NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"MyDatabase.db"];
4 FMDatabase *db = [FMDatabase databaseWithPath:dbPath] ;
5 if (![db open]) {
6    NSLog(@“Could not open db.”);
7    return ;
8 }

建立table 

如果是新建的资料库档,一开始是没有table的。建立table的方式很简单:
1 [db executeUpdate:@"CREATE TABLE PersonList (Name text, Age integer, Sex integer, Phone text, Address text, Photo blob)"];
这 是FMDB裡很常用的指令,[FMDatabase_object executeUpdate:]后面用NSString塞入SQLite语法,就解决了。因為这篇主要是在讲FMDB,所以SQLite的语法就不多说 了,上述程式码建立了一个名為PersonList的table,裡面有姓名、年龄、性别、电话、地址和照片。(嗯….很范例的一个table)
插入资料
插入资料跟前面一样,用executeUpdate后面加语法就可以了。比较不同的是,因為插入的资料会跟Objective-C的变数有关,所以在string裡使用?号来代表这些变数。

1 [db executeUpdate:@"INSERT INTO PersonList (Name, Age, Sex, Phone, Address, Photo) VALUES (?,?,?,?,?,?)",
2  
3 @"Jone", [NSNumber numberWithInt:20], [NSNumber numberWithInt:0], @“091234567”, @“Taiwan, R.O.C”, [NSData dataWithContentsOfFile: filepath]];

其中,在SQLite中的text对应到的是NSString,integer对应NSNumber,blob则是NSData。该做的转换FMDB都做好了,只要了解SQLite语法,应该没有什麼问题才是。
-更新资料
太简单了,不想讲,请看范例:

1 [db executeUpdate:@"UPDATE PersonList SET Age = ? WHERE Name = ?",[NSNumber numberWithInt:30],@“John”];
-取得资料
取得特定的资料,则需使用FMResultSet物件接收传回的内容:

01 FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList"];
02  
03 while ([rs next]) {
04  
05 NSString *name = [rs stringForColumn:@"Name"];
06  
07 int age = [rs intForColumn:@"Age"];
08  
09 }
10  
11 [rs close];

用[rs next]可以轮询query回来的资料,每一次的next可以得到一个row裡对应的数值,并用[rs stringForColumn:]或[rs intForColumn:]等方法把值转成Object-C的型态。取用完资料后则用[rs close]把结果关闭。
-快速取得资料
在有些时候,只会query某一个row裡特定的一个数值(比方只是要找John的年龄),FMDB提供了几个比较简便的方法。这些方法定义在FMDatabaseAdditions.h,如果要使用,记得先import进来。

view source print
1 //找地址
2  
3 NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John”];
4  
5 //找年齡
6  
7

int age = [db intForQuery:@"SELECT Age FROM PersonList WHERE Name = ?",@"John”];

1、首先得实例化一个FMDatabase对象,这跟Sqlitepersistentobjects 派生一个子类进行操作是不同。接着打开一个数据库(如果没有会创建一个数据库)

//paths: ios下Document路径,Document为中ios可读写的文件夹

//创建数据库实例 db 这里说明下:如果路径中不存在”Test.db”的文件,sqlite会自动创建”Test.db”

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   NSString *documentDirectory = [paths objectAtIndex:0];   //dbPath: 数据库路径,在Document中。   NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"Test.db"];       FMDatabase *db= [FMDatabase databaseWithPath:dbPath] ;   if (![db open]) {   NSLog(@“Could not open db.”);   return ;   } 

接下来,我们可以通过这个数据库对象进行操作了。操作主要是update和queries。

首先是创建表。

//创建一个名为User的表,有两个字段分别为string类型的Name,integer类型的 Age

[db executeUpdate:@"CREATE TABLE User (Name text, Age integer)"]; 

这样我们就有了一张表了。接下我们对表进行操作。插入数据!注意插入的数据使用了通配符,这跟iphone直接使用sqlite借口的绑定变量是一样的,后面的通配符匹配的数据。

//插入数据使用OC中的类型 text对应为NSString integer对应为NSNumber的整形

[db executeUpdate:@"INSERT INTO User (Name,Age) VALUES (?,?)",@"老婆",[NSNumber numberWithInt:20]] ; 

接下来是更新数据。

//更新数据 将“老婆”更改为“宝贝”   [db executeUpdate:@"UPDATE User SET Name = ? WHERE Name = ? ",@"老婆",@"宝贝"]; 

再接下来,就是删除数据啦。

//删除数据   [db executeUpdate:@"DELETE FROM User WHERE Name = ?",@"老婆"]; 

update的基本操作就这几个,接下来是queries!

//返回数据库中第一条满足条件的结果   NSString *aa=[db stringForQuery:@"SELECT Name FROM User WHERE Age = ?",@"20"]; 

这样我们就查询返回了一条数据,那当我们想要查询放返回多条数据怎么办呢?不用愁,之前我就提到了FMDB中的另外一个主要的类,FMResultSet,这是一个结果集!返回多条数据时FMDB会将数据放在这个结果集中,然后我们在对这个结果集进行查询操作!很简单。

FMResultSet *rs=[db executeQuery:@"SELECT * FROM User"];   rs=[db executeQuery:@"SELECT * FROM User WHERE Age = ?",@"20"];   while ([rs next]){   NSLog(@“%@ %@”,[rs stringForColumn:@"Name"],[rs stringForColumn:@"Age"]);   } 

更多的FMResultSet方法有:

intForColumn:

longForColumn:

longLongIntForColumn:

boolForColumn:

doubleForColumn:

stringForColumn:

dateForColumn:

dataForColumn:

dataNoCopyForColumn:

UTF8StringForColumnIndex:

objectForColumn:

具体查看一下类就行了!好了,对于FMDB的使用就这样,是不是很简单呢,其实这个些封装sqlite的框架都是万变不离其宗的,只要你掌握了sql就行了!

转载于:https://my.oschina.net/amoyai/blog/90488

FMDB(FMDatabase)--SQLite的封装相关推荐

  1. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  2. FMDB使用SQLite事务Save Point

    FMDB使用SQLite事务Save Point 在SQLite中,事务提供了批量处理,批量撤销的功能.当批量操作中有一步无法完成操作,就会把执行过的语句都撤销,恢复到撤销前的状态.但是由于SQLit ...

  3. fmdb(FMDatabase) 数据库总结

    这段时间公司在做一个新的应用,用到了数据库.在网上找了一些资料,最后决定用fmdb来做.主要是用起来比较简单,适合刚接触数据库这方面的人. 一.步  首先是创建数据库: +(NSString*)fil ...

  4. FMDB與SQLite 數據庫應用示範:打做一隻簡單的電影資料庫 App

    原文:http://www.appcoda.com/fmdb-sqlite-database/ 作者:GABRIEL THEODOROPOULOS 譯者:kmyhy 通常在 App 中使用數據庫并處理 ...

  5. 安卓获取mysql数据封装方法_android SQLite数据库封装

    终于有时间好好看看数据库了 今天下午自己封装了一个SQLite数据库 留着以后自己用吧 虽然还有许多要修改的地方 贴出代码先 package com.example.testdatabase; imp ...

  6. android 本地数据库sqlite的封装

    单机android   sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录  运行 sqlite ...

  7. HTML5plus SQLite 方法封装 demo

    SQLite模块用于操作本地数据库文件,可实现数据库文件的创建,执行SQL语句等功能. <!DOCTYPE html> <html> <head><meta ...

  8. GitHub Top 100 Objective-C 项目简介

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 若有任何疑问可通过微博@李锦发联系我 GitHub 地 ...

  9. GitHub上排名前100的iOS开源库介绍(来自github)

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介,方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 项目名称 项目信息 1. AFNetworking 作者 ...

最新文章

  1. linux文件自动删除,自动删除文件脚本(Linux shell脚本)
  2. php怎么写获取手机剪切板到搜索栏,如何根据指定的剪切板获取html?
  3. RPC框架原理及从零实现系列博客(二):11个类实现简单RPC框架
  4. 【NSGAII】基于NSGAII的多目标优化算法的MATLAB仿真
  5. webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)
  6. 北漂、杭漂,居大不易,他们是怎么买第一套房子的
  7. mysql time 5分钟_MySQL 使用 PV 和 PVC 每天5分钟玩转 Docker 容器技术(154)
  8. matlab中rgb转hsv,matlab实现RGB与HSV(HSB)、HSL和HSI的色彩空间互转
  9. 数百万人都在使用的9款无线路由器易受226个缺陷影响
  10. 关键业务开放平台助金融行业数字化转型
  11. mysql sqlyog 备份计划_SqlYog 自动备份数据库
  12. MQTT Java 客户端
  13. 百度“有啊”困局之源:流量到交易的转化
  14. i711800h核显相当于什么显卡 i7 11800h相当于台式什么CPU
  15. 论文会议推荐到计算机研究与发展,计算机研究与发展类论文参考文献 计算机研究与发展核心期刊参考文献有哪些...
  16. python参数内存地址
  17. 惊了!这才是真正的 Windows 摸鱼神器!!!
  18. 逃离迷宫的路径(打印路径)
  19. icloud备份qq数据怎么恢复
  20. PWA:安装 Web 应用

热门文章

  1. jmeter html 乱码,JMeter3.0图形化HTML报告中文乱码问题处理
  2. linux mysql降权_怎样将mysql数据库root降权
  3. c 判断文件是否存在_C++基础:判断文件是否存在的方法
  4. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...
  5. 最近点对模板__hdu1007
  6. windows vbs显示桌面命令
  7. Docker容器管理
  8. linux中sleep详解实例
  9. Java并发专题 带返回结果的批量任务运行 CompletionService ExecutorService.invokeAll
  10. [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)