网站备案期间访问,html编辑器汉化版,网易企业邮箱入口官网,运城网站建设公司有多少FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架#xff0c;更加轻量级和灵活 提供了多线程安全…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有三个主要的类 1FMDatabase 一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句 2FMResultSet 使用FMDatabase执行查询后的结果集 3FMDatabaseQueue 用于在多线程中执行多个查询或更新它是线程安全的 三、打开数据库 通过指定SQLite数据库文件路径来创建FMDatabase对象 FMDatabase *db [FMDatabase databaseWithPath:path]; if (![db open]) { NSLog(数据库打开失败); } 文件路径有三种情况 1具体文件路径 如果不存在会自动创建 2空字符串 会在临时目录创建一个空的数据库 当FMDatabase连接关闭时数据库文件也被删除 3nil 会创建一个内存中临时数据库当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.dbdb;
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; i10; 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.queuequeue;
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