IOS第三方数据库--FMDB 分类: ios技术 2015-03-01 09:38 57人阅读 评论(0) 收藏
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);
- }
- }];
- }
- });
版权声明:本文为博主原创文章,未经博主允许不得转载。
IOS第三方数据库--FMDB 分类: ios技术 2015-03-01 09:38 57人阅读 评论(0) 收藏的更多相关文章
- *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏
*** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...
- 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...
- 哈希-Gold Balanced Lineup 分类: POJ 哈希 2015-08-07 09:04 2人阅读 评论(0) 收藏
Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13215 Accepted: 3873 ...
- HDU 1272 小希的迷宫(并查集) 分类: 并查集 2015-07-07 23:38 2人阅读 评论(0) 收藏
Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...
- hadoop容灾能力测试 分类: A1_HADOOP 2015-03-02 09:38 291人阅读 评论(0) 收藏
实验简单来讲就是 1. put 一个600M文件,分散3个replica x 9个block 共18个blocks到4个datanode 2. 我关掉了两个datanode,使得大部分的block只在 ...
- sscanf 函数 分类: POJ 2015-08-04 09:19 4人阅读 评论(0) 收藏
sscanf 其实很强大 分类: 纯C技术 技术笔记 2010-03-05 16:00 12133人阅读 评论(4) 收藏 举报 正则表达式stringbuffercurlgoogle 最近在做日志分 ...
- Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏
Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单 ...
- iOS 消息推送原理及实现总结 分类: ios技术 2015-03-01 09:22 70人阅读 评论(0) 收藏
在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服 ...
- ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏
我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好.因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用.异步请求的用户体验要比同步请求好,因此一般情 ...
随机推荐
- Dom++完美版得到元素到html的距离6/4/21
function getTop(obj) { var pos={left:0,top:0}; while(obj) { pos.left+=obj.offsetLeft; pos.top+=obj.o ...
- C语言开发工具
1.编写程序的工具: indent命令将自动调整C代码的缩进风格,个人比较喜欢indent -kr 2.编译C语言程序: 1.gcc编译器: gcc是一个ANSI C兼容编译器,C++编译器也可以编译 ...
- dos命令创建安卓签名
1.dos下进入到jdk安装目录的bin目录, 如:C:\Program Files\Java\jdk1.7.0_79\bin 2.输入命令格式如: keytool -genkey -alias aa ...
- LINUX中磁盘挂载与卸除
一.挂载格式与参数说明: 要将文件系统挂载到我们的 Linux 系统上,就要使用 mount 这个命令啦! 不过,这个命令真的是博大精深-粉难啦!我们学简单一点啊- ^_^ [root@www ~]# ...
- SQL Server 索引维护sql语句
使用以下脚本查看数据库索引碎片的大小情况: 复制代码代码如下: DBCC SHOWCONTIG WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS 以 ...
- 不停止MySQL服务增加从库的两种方式【转载】
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- Codeforces Round #272 (Div. 1) B 构造 math
http://www.codeforces.com/contest/477/problem/C 题目大意:给你n个集合,每个集合里面有四个数字,他们的gcd是k,输出符合条件的集合中m,m为集合中最大 ...
- C#入门经典第八章面向对象编程简介-1
面向对象编程(Object-Oriented Programming,OOP)技术 本章中的OPP实际上是.NET OOP,这里讲的一些技术不能应用于其他OOP环境.
- java.net.URLEncode编码 与 URLDecode解码问题
1.java内部加密和解密 String mytext = java.net.URLEncoder.encode("中国", "utf-8"); String ...
- USACO Section 1.3 Barn Repair 解题报告
题目 题目描述 某农夫有一个养牛场,所有的牛圈都相邻的排成一排(共有S个牛圈),每个牛圈里面最多只圈养一头牛.有一天狂风卷积着乌云,电闪雷鸣,把牛圈的门给刮走了.幸运的是,有些牛因为放假,所以没在自己 ...