iOS开发数据库篇—FMDB简单介绍
一、简单说明
1.什么是FMDB
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
2.FMDB的优点
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地防止数据混乱
3.FMDB的github地址
二、核心类
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.m
3
//
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进行编号。
注意:
不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。
sqlite语句
/*
简单约束
*/
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT
NULL
, age INTEGER NOT
NULL
);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT
1
);
/*
分页
*/
SELECT * FROM t_student ORDER BY id ASC LIMIT
30
,
10
;
/*
排序
*/
SELECT * FROM t_student WHERE score >
50
ORDER BY age DESC;
SELECT * FROM t_student WHERE score <
50
ORDER BY age ASC , score DESC;
/*
计量
*/
SELECT COUNT(*) FROM t_student WHERE age >
50
;
/*
别名
*/
SELECT name as myName, age as myAge, score as myScore FROM t_student;
SELECT name myName, age myAge, score myScore FROM t_student;
/*
查询
*/
SELECT name, age, score FROM t_student;
SELECT * FROM t_student;
/*
修改指定数据
*/
UPDATE t_student SET name =
'MM'
WHERE age =
10
;
UPDATE t_student SET name =
'WW'
WHERE age is
7
;
UPDATE t_student SET name =
'XXOO'
WHERE age <
20
;
UPDATE t_student SET name =
'NNMM'
WHERE age <
50
and score >
10
;
/*
删除数据
*/
DELETE FROM t_student;
/*
更新数据
*/
UPDATE t_student SET name =
'LNJ'
;
/*
插入数据
*/
INSERT INTO t_student(age, score, name) VALUES (
'28'
,
100
,
'jonathan'
);
INSERT INTO t_student(name, age) VALUES (
'lee'
,
'28'
);
INSERT INTO t_student(score) VALUES (
100
);
/*
插入数据
*/
INSERT INTO t_student(name, age, score) VALUES (
'lee'
,
'28'
,
100
);
/*
删除表
*/
DROP TABLE IF EXISTS t_student;
DROP TABLE t_student;
/*
创建表
*/
CREATE TABLE IF NOT EXISTS t_student(id INTEGER , name TEXT, age , score REAL);
/*
创建表并添加主键主设置主键主动增长
*/
CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, score REAL);
/*
创建表并添加主键
*/
CREATE TABLE IF NOT EXISTS t_student (id INTEGER, name TEXT, age INTEGER, score REAL, PRIMARY KEY(id));