资讯专栏INFORMATION COLUMN

慕课网_《iOS基础教程-SQLite数据库操作》学习总结

fevin / 1010人阅读

时间: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 总结

步骤总结

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16797.html

相关文章

  • 课网_iOS基础教程-SQLite据库操作学习总结

    时间:2017年06月02日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:学习指南 1-1 课程介绍 SQLite操作 轻量型关系型数据库管理系统 嵌入式数据库 占用资源低 可移植性强 速度快 SQLite3 第二章:数据类型和指令 2-1 数据类型及...

    izhuhaodev 评论0 收藏0
  • 课网_iOS基础教程-文件操作学习总结

    摘要:时间年月日星期二说明本文部分内容均来自慕课网。文件路径写入图片慕课网图片 时间:2017年06月06日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:学习指南 1-1 学习指南 应用需求 showImg(https://segmentfault...

    cartoon 评论0 收藏0
  • 课网_iOS基础教程-网络操作学习总结

    时间:2017年05月23日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:学习指南 1-1 学习指南 学习内容 HTTP简介 HTTP作用 获取一段网络数据:get请求 更新一段网络数据:post请求 使用UIWebView加载网页 总结 HTTP的起源...

    BlackMass 评论0 收藏0
  • 课网_iOS基础教程-数据解析》学习总结

    摘要:时间年月日星期五说明本文部分内容均来自慕课网。而是基于事件的。当某个事件被触发时,才获取相应的的部分数据,从而不管文件有多大,都只占用了少量的内存空间。可以读取也可以向文件中插入数据,而却只能对进行读取,而不能在文件中插入数据。 时间:2017年06月02日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https:...

    atinosun 评论0 收藏0
  • 课网_《RxJava与RxAndroid基础入门》学习总结

    时间:2017年10月16日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程简介 1-1 课程介绍 本门课程的主要内容 RxJava是什么 RxAndroid是什么 RxJava常用操作符(重点、难点) 怎样在项目中使用RxJava和RxAndroid 如何学...

    刘明 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<