时间:2017年06月02日星期五
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...
第一章:学习指南
1-1 课程介绍
SQLite操作
轻量型关系型数据库管理系统
嵌入式数据库
占用资源低
可移植性强
速度快
SQLite3
第二章:数据类型和指令
2-1 数据类型及指令
SQLite支持的数据类型
没有布尔类型,用整数0或1代替
没有日期、时间类型数据,存储在TEXT、REAL类型中,通常按字符串处理
SQLite语句
第三章:操作数据库
3-1 打开数据库一
创建数据库
1.使用sqlite3_open函数打开数据库
2.使用sqlite3_exec函数执行Create Table语句
3.使用sqlite3_close函数释放资源
3-2 打开数据库二
编写SQLManager类,单例模式生成该类
+ (SQLManager *)shareManager{
static dispatch_once_t once;
dispatch_once(&once,^{
manager = [[self alloc] init];
[manager createDataBaseTableIfNeeded];
});
return manager;
}
3-3 打开数据库三
调用方法
// 第一个参数是数据库文件所在的完整路径
// 第二个参数是数据库 DataBase
if(sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK){// SQLITE_OK 代表打开成功
// 失败
sqlite3_close(db);// 关闭数据库
NSAssert(NO, @"数据库打开失败!");
}else{
// 成功 TODO
}
3-4 执行语句
调用方法
// 第一个参数是数据库 db对象
// 第二个参数是SQL语句
// 第三个和第四个分别是回调函数和回调函数传递的参数
// 第五个参数是一个错误信息
sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err)
3-5 关闭数据库
调用方法
sqlite3_close(db);
本章完整代码
// 获取数据库路径
- (NSString *)applicationDocumentsDirectoryFile{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths firstObject];
NSString *filePath = [documentDirectory stringByAppendingPathComponent:kNameFile];
return filePath;
}
// 创建数据库
- (void)createDataBaseTableIfNeeded {
NSString *writetablePath = [self applicationDocumentsDirectoryFile];
NSLog(@"数据库的地址是:%@",writetablePath);
// 第一个参数是数据库文件所在的完整路径
// 第二个参数是数据库 DataBase
if(sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK){// SQLITE_OK 代表打开成功
// 失败
sqlite3_close(db);// 关闭数据库
NSAssert(NO, @"数据库打开失败!");
}else{
char *err;
NSString *createSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS StudentName (idNum TEXT PRIMARY KEY,name TEXT);"];
// 第一个参数是数据库 db对象
// 第二个参数是SQL语句
// 第三个和第四个分别是回调函数和回调函数传递的参数
// 第五个参数是一个错误信息
if(sqlite3_exec(db, [createSQL UTF8String], nil, nil, &err) != SQLITE_OK){
// 失败
sqlite3_close(db);// 关闭数据库
NSAssert(NO, @"建表失败!");
}
sqlite3_close(db);
}
}
第四章:预处理和绑定
4-1 预处理
查询数据
调用方法
// 第一个参数是数据库 db对象
// 第二个参数是SQL语句
// 第三个参数是执行语句的长度,-1是指全部长度
// 第四个参数是语句对象
// 第五个参数是没有执行的语句部分 NULL
if(sqlite3_prepare_v2(db, [querySQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
// 预处理成功 TODO
}else{
// 预处理失败 TODO
}
4-2 绑定
调用方法
// 第一个参数 语句对象
// 第二个参数 参数开始执行的序号
// 第三个参数 我们要绑定的值
// 第四个参数 绑定的字符串的长度
// 第五个参数 指针 NULL
sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);
4-3 遍历过程
调用方法
// 有一个返回值 SQLITE_ROW 常量代表查出来了
if (sqlite3_step(statement) == SQLITE_ROW) {
// 查询成功,有数据 TODO
}else{
// 查询失败,无数据 TODO
}
4-4 提取数据
调用方法
// 提取数据
// 第一个参数 语句对象
// 第二个参数 字段的索引
char *idNum = (char *)sqlite3_column_text(statement, 0);
本章完整代码
// 查询
- (StudentModel *)searchWithIdNum:(StudentModel *)model{
NSString *path = [self applicationDocumentsDirectoryFile];
if(sqlite3_open([path UTF8String], &db) != SQLITE_OK){// SQLITE_OK 代表打开成功
// 失败
sqlite3_close(db);// 关闭数据库
NSAssert(NO, @"数据库打开失败!");
}else{
NSString *querySQL = @"SELECT idNum,name FROM StudentName where idNum = ?";
sqlite3_stmt *statement;//语句对象
// 第一个参数是数据库 db对象
// 第二个参数是SQL语句
// 第三个参数是执行语句的长度,-1是指全部长度
// 第四个参数是语句对象
// 第五个参数是没有执行的语句部分 NULL
if(sqlite3_prepare_v2(db, [querySQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
// 进行 按主键查询数据库
NSString *idNum = model.idNum;
// 第一个参数 语句对象
// 第二个参数 参数开始执行的序号
// 第三个参数 我们要绑定的值
// 第四个参数 绑定的字符串的长度
// 第五个参数 指针 NULL
sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);
// 有一个返回值 SQLITE_ROW 常量代表查出来了
if (sqlite3_step(statement) == SQLITE_ROW) {
// 提取数据
// 第一个参数 语句对象
// 第二个参数 字段的索引
char *idNum = (char *)sqlite3_column_text(statement, 0);
// 数据转换
NSString *idNumStr = [[NSString alloc] initWithUTF8String:idNum];
char *name = (char *)sqlite3_column_text(statement, 1);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
StudentModel *respModel = [[StudentModel alloc] init];
respModel.idNum = idNumStr;
respModel.name = nameStr;
sqlite3_finalize(statement);
sqlite3_close(db);
NSLog(@"数据查询成功!idNum=%@",model.idNum);
return respModel;
}
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
NSLog(@"数据查询失败!idNum=%@",model.idNum);
StudentModel *respModel = [[StudentModel alloc] init];
respModel.idNum = @"200";
respModel.name = @"测试2";
return respModel;
}
第五章:修改数据库
5-1 绑定过程
修改数据
5-2 修改数据库
完整代码
// 保存数据
- (int)insert:(StudentModel *)model{
NSString *path = [self applicationDocumentsDirectoryFile];
if(sqlite3_open([path UTF8String], &db) != SQLITE_OK){// SQLITE_OK 代表打开成功
// 失败
sqlite3_close(db);// 关闭数据库
NSAssert(NO, @"数据库打开失败!");
}else{
// 编写SQL语句
NSString *insertSQL = @"INSERT OR REPLACE INTO StudentName (idNum,name) VALUES (?,?)";
// 定义预编译语句
sqlite3_stmt *statement;
// 进行预处理
if(sqlite3_prepare_v2(db, [insertSQL UTF8String], -1, &statement, NULL) == SQLITE_OK){
// 进行参数绑定
sqlite3_bind_text(statement, 1, [model.idNum UTF8String], -1, NULL);
sqlite3_bind_text(statement, 2, [model.name UTF8String], -1, NULL);
// 执行预处理语句
if (sqlite3_step(statement) != SQLITE_DONE) {
// 操作未完成
NSAssert(NO, @"保存数据失败!");
}
NSLog(@"数据保存成功!idNum=%@,name=%@",model.idNum,model.name);
sqlite3_finalize(statement);
sqlite3_close(db);
}
}
return 0;
}
第六章:总结
6-1 总结
步骤总结