最近因为实训中用到数据库,就从想找些资料关于FMDB保存数据的,特别是保存数组、字典、模型等复杂的类型数据,但是网上一搜,全是字符串的一些增加、删除等,难道网上发帖的人都是只会这些的吗?所以很生气就自己研究了一下,写了一个关于保存一些基本类型、数组、字典(有3种方法,这里只介绍一种)、模型和时间的Demo。(很多坑都已经避开,大家工作中,拿来即用……)
一、简单介绍
一)、FMDB框架中重要的框架类
-
FMDatabase
FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
-
FMResultSet
使用FMDatabase执行查询后的结果集
-
FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
二)、FMDB思维导图
iOS2期思维导图学习二、使用
一)、封装结构
(考虑到部分人理解起来困难,现给一个简单版本,想封装的酷点,可以参考实训项目给的框架源码)
二)、模块代码
- DBHeader.h
/** 表名 */
`#define KTable_UserName1 @"KTable_UserName1"
/** 一个存数据库需要的头文件 */
#import "FMDB.h"
#import "DAO.h"
#import "DataBaseManager.h"
- DataBaseManager.h
@implementation DataBaseManager
//单例
+(instancetype)sharedManager{
static DataBaseManager *manager = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
manager = [[DataBaseManager alloc] init];
});
return manager;
}
- (instancetype)init{
if (self = [super init]) {
NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"DB1.sqlite"];
NSLog(@"路径 = %@",filePath);
_databaseQueue = [FMDatabaseQueue databaseQueueWithPath:filePath];
}
return self;
}
@end
- DAO.m
- (FMDatabaseQueue *)databaseQueue{
return [DataBaseManager sharedManager].databaseQueue;;
}
+ (void)creatTableIfNeed{
//【注意】:以后做sql语句,()外面的参数用字符串拼,()里面的参数放在执行方法里写
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, score REAL,arr BLOB,dic BLOB,book BLOB,img BLOB)",KTable_UserName1];
[[DataBaseManager sharedManager].databaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
if ([db executeUpdate:sql]) {
NSLog(@"创建表成功");
}
}];
}
- UserDAO.h
@interface UserDAO : DAO //一定要继承DAO,不然self点不出来databaseQueue的
///单例
+(instancetype)sharedInstance;
/*!
* 插入数据
*/
- (BOOL)insertUserDTO:(UserDTO *)dto;
/*!
* 获取数据
*/
- (NSArray *)loadUserData;
/*!
* 修改数据
*/
- (BOOL)updateUserDTO:(UserDTO *)dto;
/*!
* 删除某个模型
*/
- (BOOL)deleteUserDTO:(UserDTO *)dto;
@end
三)、常用sql语句
创建表
CREATE TABLE IF NOT EXISTS "T_Person" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"age" INTEGER,
"heigth" REAL
)
//下边是sqllite编译器里边的语句
/*简单约束*/
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 UNIQUE,
age INTEGER
);
/*添加主键*/
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)
);
查询
/*分页*/
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 s.name myName, s.age myAge, s.score myScore
FROM t_student s
WHERE s.age > 50;
/*查询*/
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;
/*更新记录的name*/
UPDATE t_student SET name = 'zhangsan';
删除
DELETE FROM t_student;
DELETE FROM t_student WHERE age < 50;
插入
INSERT INTO t_student
(age, score, name)
VALUES
('28', 100, 'zhangsan');
INSERT INTO t_student
(name, age)
VALUES
('lisi', '28');
INSERT INTO t_student
(score)
VALUES
(100);
删除表
/*删除表*/
DROP TABLE IF EXISTS t_student;