iOS-数据持久化-第三方框架FMDB的使用

FMDB简单介绍

一、简单说明

1.什么是FMDB

FMDB是iOS平台的SQLite数据库框架

FMDB以OC的方式封装了SQLite的C语言API

 

2.FMDB的优点

使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码

对比苹果自带的Core Data框架,更加轻量级和灵活

提供了多线程安全的数据库操作方法,有效地防止数据混乱

 

3.FMDB的github地址

https://github.com/ccgus/fmdb

 

二、核心类

FMDB有三个主要的类

(1)FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库

用来执行SQL语句

 

(2)FMResultSet

使用FMDatabase执行查询后的结果集

 

(3)FMDatabaseQueue

用于在多线程中执行多个查询或更新,它是线程安全的

 

三、打开数据库

通过指定SQLite数据库文件路径来创建FMDatabase对象

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

    NSLog(@"数据库打开失败!");

}

 

文件路径有三种情况

(1)具体文件路径

  如果不存在会自动创建

 

(2)空字符串@""

  会在临时目录创建一个空的数据库

  当FMDatabase连接关闭时,数据库文件也被删除

 

(3)nil

  会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

 

四、执行更新

在FMDB中,除查询以外的所有操作,都称为“更新”

create、drop、insert、update、delete等

 

使用executeUpdate:方法执行更新

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

 

示例

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

 

五、执行查询

查询方法

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

 

示例

// 查询数据

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

 

// 遍历结果集

while ([rs next]) {

    NSString *name = [rs stringForColumn:@"name"];

    int age = [rs intForColumn:@"age"];

    double score = [rs doubleForColumn:@"score"];

}

 

六、代码示例

1.新建一个项目,导入libsqlite3库,并在项目中包含主头文件

2.下载第三方框架FMDB

  

3.示例代码

  YYViewController.m文件

复制代码
 1 //2 //  YYViewController.m3 //  04-FMDB基本使用4 //5 //  Created by apple on 14-7-27.6 //  Copyright (c) 2014年 wendingding. All rights reserved.7 //8 9 #import "YYViewController.h"
10 #import "FMDB.h"
11 
12 @interface YYViewController ()
13 @property(nonatomic,strong)FMDatabase *db;
14 @end
15 
16 @implementation YYViewController
17 
18 - (void)viewDidLoad
19 {
20     [super viewDidLoad];
21     //1.获得数据库文件的路径
22     NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
23     NSString *fileName=[doc stringByAppendingPathComponent:@"student.sqlite"];
24     
25     //2.获得数据库
26     FMDatabase *db=[FMDatabase databaseWithPath:fileName];
27     
28     //3.打开数据库
29     if ([db open]) {
30         //4.创表
31         BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
32         if (result) {
33             NSLog(@"创表成功");
34         }else
35         {
36             NSLog(@"创表失败");
37         }
38     }
39     self.db=db;
40 
41 }
42 
43 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
44 {
45     [self delete];
46     [self insert];
47     [self query];
48 }
49 
50 //插入数据
51 -(void)insert
52 {
53     for (int i = 0; i<10; i++) {
54         NSString *name = [NSString stringWithFormat:@"jack-%d", arc4random_uniform(100)];
55         // executeUpdate : 不确定的参数用?来占位
56         [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", name, @(arc4random_uniform(40))];
57         //        [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
58         
59         // executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
60         //        [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
61     }
62 }
63 
64 //删除数据
65 -(void)delete
66 {
67     //    [self.db executeUpdate:@"DELETE FROM t_student;"];
68     [self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
69     [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
70 }
71 
72 //查询
73 - (void)query
74 {
75     // 1.执行查询语句
76     FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"];
77     
78     // 2.遍历结果
79     while ([resultSet next]) {
80         int ID = [resultSet intForColumn:@"id"];
81         NSString *name = [resultSet stringForColumn:@"name"];
82         int age = [resultSet intForColumn:@"age"];
83         NSLog(@"%d %@ %d", ID, name, age);
84     }
85 }
86 
87 @end
复制代码

打印查看结果:

提示:

如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是从0开始,而是接着之前的ID进行编号。

注意:

  不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。

 --------------------------------------------------------------------------------------------------------------------------------------------------------------

FMDB数据库队列

一、代码示例

1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库。

2.代码如下:

复制代码
 1 //2 //  YYViewController.m3 //  05-FMDB数据库队列4 //5 //  Created by apple on 14-7-28.6 //  Copyright (c) 2014年 wendingding. All rights reserved.7 //8 9 #import "YYViewController.h"
10 #import "FMDB.h"
11 
12 @interface YYViewController ()
13 @property(nonatomic,strong)FMDatabaseQueue *queue;
14 @end
15 
16 @implementation YYViewController
17 
18 - (void)viewDidLoad
19 {
20     [super viewDidLoad];
21     
22     //1.获得数据库文件的路径
23     NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
24     NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];
25     
26     //2.获得数据库队列
27     FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName];
28 //    FMDatabase *db=[FMDatabase databaseWithPath:fileName];
29     
30     //3.打开数据库
31     [queue inDatabase:^(FMDatabase *db) {
32          BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
33         if (result) {
34             NSLog(@"创表成功");
35         }else
36         {
37             NSLog(@"创表失败");
38         }
39     }];
40     self.queue=queue;
41     
42 }
43 
44 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
45 {
46     //插入数据
47 //    [self.queue inDatabase:^(FMDatabase *db) {
48 //        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
49 //    }];
50     
51     //查询数据
52     [self.queue inDatabase:^(FMDatabase *db) {
53         // 1.执行查询语句
54         FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"];
55 
56         // 2.遍历结果
57         while ([resultSet next]) {
58             int ID = [resultSet intForColumn:@"id"];
59             NSString *name = [resultSet stringForColumn:@"name"];
60             int age = [resultSet intForColumn:@"age"];
61             NSLog(@"%d %@ %d", ID, name, age);
62         }
63     }];
64 
65 }
66 
67 @end
复制代码

先插入数据,之后查询结果,打印如下:

3.代码说明

有了一个队列对象,它的内部自动就拥有一个数据库对象,且数据库的操作是线程安全的。
二、事务
事务,没有事务的话会出现问题。
举例:银行的例子
张三和李四账户都有1000块钱,如果张三要转账给李四,需要执行两条SQL语句,考虑到安全性,要求这两条鱼具要么全部执行成功,要不全部执行失败。
事务:把多条语句放到同一个事务中,要么全部成功,要不全部失败(如果中途出现问题,那么会自动回滚)。事务的执行具有原子性。
事务代码处理:
把多条语句添加到一个事务中去执行:
复制代码
1    //插入数据
2     [self.queue inDatabase:^(FMDatabase *db) {
3         [db beginTransaction];
4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
7         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
8         [db commit];
9     }];
复制代码

如果中途出现问题,那么会自动回滚,也可以选择手动回滚。

复制代码
 1     //插入数据2     [self.queue inDatabase:^(FMDatabase *db) {3         [db beginTransaction];4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];7         [db rollback];8         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];9         [db commit];
10     }];
复制代码

上面的代码。前三条插入语句是作废的。

事务处理的另一种方式:

1    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
2         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
3         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
5     }];

说明:先开事务,再开始事务,之后执行block中的代码段,最后提交事务。

转载于:https://www.cnblogs.com/LifeTechnologySupporter/p/5016938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑word文档打不开怎么办_word怎么转pdf?两个值得学习的高效转换法

word怎么转pdf&#xff1f;两个值得学习的高效转换法word怎么转pdf&#xff1f;pdf格式是我们经常能够使用到的格式&#xff0c;因为pdf格式在传递的过程中能更好地避免文件出现乱码打不开或误触导致文件被修改的情况。那如果想要把word文件转换成pdf格式以避免阅读word时文件被…

sql server常用函数、常用语句

一、常用函数 1.字符串函数 &#xff1a; charindex(:,abc:123) --寻找一个字符在一段字符串中起始的位置 len(zhangsan) --获取一段字符串的长度 left(Ly,君子之耀,2) --从一段字符串左边返回指定长度的字符 right(char_expr,int_expr) --返回字符串右边int_expr个字符 …

python 矩阵乘法 跳过nan_python – Numpy:当一些向量元素等于零时,矩阵向量乘法不会跳过计算吗?...

我最近一直致力于一个项目,其中我的大部分时间花费在密集矩阵A和稀疏向量v上(见here).在我尝试减少计算时,我注意到A.dot(v)的运行时间不受v的零条目数的影响.为了解释为什么我希望在这种情况下改进运行时,让result A.dot.v使得j 1的结果[j] sum_i(A [i,j] * v [j])… v.sha…

[转]Responsive Tables Demo

本文转自&#xff1a;http://elvery.net/demo/responsive-tables/ A quick and dirty look at some techniques for designing responsive table layouts. This was put together in haste (and with the aid of Twitter Bootstrap) for What Do You Know Brisbane hosted by W…

Scala函数式对象-有理数

有理数类的表示 实现规范&#xff1a;支持有理数的加减乘除&#xff0c;并支持有理数的规范表示 1.定义Rational 首先&#xff0c;考虑用户如何使用这个类&#xff0c;我们已经决定使用“Immutable”方式来使用Rational对象&#xff0c;我们需要用户在定义Rational对象时提供分…

2020双十一实时大屏_2020拼多多双十一,拼多多双十一活动

2020拼多多双十一&#xff0c;拼多多双十一活动&#xff0c;2020拼多多双十一&#xff0c;拼多多双十一活动2020拼多多双十一&#xff0c;拼多多双十一活动拼多多双11来了全球狂欢节先领券再购物低价风暴 震撼来袭没有最低 只有更低拼多多优惠券商城拼多多优惠商城&#xff0c;…

dataTables本地刷新数据解决只能初始化一次问题

2019独角兽企业重金招聘Python工程师标准>>> dataTables的表格只能初始化一次&#xff0c;这样如果需要动态改变表格数据的话就需要写多个表格&#xff0c;这样很显然不是一个好的解决方案。 dataTables Api提供了刷新数据解决方案&#xff1a; 这里大概说一下案例&…

安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法

原来ubunto不提倡设置root用户&#xff0c;系统安装成功后&#xff0c;root密码是随机的&#xff0c;那么在这种情况下如何得到root权限呐&#xff0c;具体方法如下&#xff1a; 终端中输入&#xff1a;sudo passwd root 此时重新设置原登录用户的密码。 设置成功后在终端继续输…

linux命令headtail

一、head语法head [-n -k ]... [FILE]...//k是数字默认是显示开头前10行。head /etc/passwd显示开头前5行head -5 /etc/passwdhead -n 5 /etc/passwd&#xff08;注意和以下的有-的差别&#xff09;head -n 5 /etc/passwd 除最后k行外&#xff0c;显示剩余所有内容。head -n -5…

用-force –opengl 指令_苹果新系统ios14新功能汇总 轻点背面等小技巧怎么用

在 iOS 14 以及更新系统中&#xff0c;苹果为 iPhone X 以及更新机型带来了“轻点背面”功能&#xff0c;可以让用户轻点手机背面来实现更多操作&#xff0c;并且这项功能还支持“快捷指令”。例如&#xff0c;如果您不希望应用读取剪贴板中私密内容&#xff0c;可以利用“轻点…

PE文件格式(加密与解密3)(一)

本次的了解主要讲解 PE的基本概念、MS-DOS文件头、PE文件头、区块、输入表、输出表等。 这里我将会结合一个简单的小程序来加深我对PE文件结构的了解。 使用学习工具&#xff1a;有StudyPE、LordPE、PEID。 学习PE建议看书。。和自己动手。。。 PE文件&#xff1a; 在WIN上&…

mysql用户_MySQL用户权限管理详解

用户权限管理主要有以下作用&#xff1a;1. 可以限制用户访问哪些库、哪些表2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作3. 可以限制用户登录的IP或域名4. 可以限制用户自己的权限是否可以授权给别的用户一、用户授权mysql> grant all privile…

对ContentProvider中getType方法的一点理解

在上篇博客中我们介绍了自定义ContentProvider&#xff0c;但是遗漏掉了一个方法&#xff0c;那就是getType&#xff0c;自定义ContentProvider一般用不上getType方法&#xff0c;但我们还是一起来探究下这个方法究竟是干什么的&#xff1f;我们先来看看ContentProvider中对这个…

手把手教Electron+vue的使用

.现如今前端框架数不胜数&#xff0c;尤其是angular、vue吸引一大批前端开发者&#xff0c;在这个高新技术快速崛起的时代&#xff0c;自然少不了各种框架的结合使用。接下来是介绍electronvue的结合使用。 2.Electron是什么&#xff1f;&#xff1f; 对于我来说Electron相当于…

shell循环和分支

循环和分支对代码块的操作是构造组织shell脚本的关键. 循环和分支结构为脚本编程提供了操作代码块的工具.10.1. Loops循环就是重复一些命令的代码块,如果条件不满足就退出循环.for loopsfor arg in [list]这是一个基本的循环结构.它与C的for结构有很大不同.forarg in [list]do …

mysql主从_MySQL主从原理及配置详解

MySQL主从配置及原理&#xff0c;供大家参考&#xff0c;具体内容如下一、环境选择&#xff1a;1.Centos 6.52.MySQL 5.7二、什么是MySQL主从复制MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器&#xff0c;另一台或多台服务器充当从数据库服务…

引导修复 不是活动的_河南省视频数据修复中心

河南省视频数据修复中心 lk6afds河南省视频数据修复中心 文件预览我找到了我要恢复文件&#xff0c;可是&#xff0c;这个文件能能正确恢复呢。没有用的文件不可以删掉吗。我们先来看看盘文件夹都是什么吧。(以下仅限于~系统)一般来说&#xff0c;刚刚安装的电脑系统盘主要包含…

企业日志分析 五大问题需重点注意

资讯 | 安全 | 论坛 | 下载 | 读书 | 程序开发 | 数据库 | 系统 | 网络 | 电子书 | 微信学院 | 站长学院 | 源码 | QQ | 专栏 | 考试 | 系统安全| 网站安全| 企业安全| 网络安全| 工具软件| 杀毒防毒| 加密解密|首页 > 安全 > 企业安全 > 正文企业安全…

sqlite换成mysql_从SQLITE的数据转到MYSQL

接同事需求&#xff0c;要求从SQLITE的数据转到MYSQL&#xff0c;这东西以前也没接触过。这里搜搜&#xff0c;那里试试&#xff0c;下面把过程列一下。主要过程分三步&#xff1a;1&#xff0c;把SQLITE表结构导出来&#xff0c;作一定的格式调整2&#xff0c;把SQLITE数据导出…

python学习笔记(一):python入门

上周六终于开始接触心心念念的python了&#xff0c;本人学习语言算是零基础&#xff0c;java语法比较复杂&#xff0c;所以选择了一个语法相对还是比较简单&#xff0c;而且现在使用也是越来越广泛的python进行了学习。下面就言归正传吧 在学习python之前先来了解下现今比较流行…