IOS--UI--LessonDataBase
2015-07-28 18:58
399 查看
数据库的增删改查
首先用 sb 搭建一个非常简单的带有四个 textfiled 和四个 button 的界面
![](http://img.blog.csdn.net/20150728173942058)
在这里 我们使用单例来传值 顺便复习一下 单例的使用
创建一个基于 NSObject 的类 DataBase
我们需要实现的方法
//单例的好处:
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,节约内存;
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
方法1 打开数据库
方法2;
上面的方法 其实都是为了我们的 button 做铺垫的 因为 如果你想对数据库增删改查 就先要打开数据 然后关闭 上面就是封装好的方法
button 的功能实现1.插入
//插入数据接口
//查询表中所有数据的接口 返回的是一组人
根据属性查询学生
根据属性 删除对象
5.根据 xxx 修改学生信息
总结;
1.方法的实现步骤几乎都是一样的
2.不要忘记打开数据库 和关闭数据库 释放 stmt
首先用 sb 搭建一个非常简单的带有四个 textfiled 和四个 button 的界面
在这里 我们使用单例来传值 顺便复习一下 单例的使用
创建一个基于 NSObject 的类 DataBase
我们需要实现的方法
.h #import <Foundation/Foundation.h> @class StudentMode; @interface DataBaseHandle : NSObject //创建一个对外的单例接口 +( DataBaseHandle *)shareDataBase; //打开数据库 -(void)openDB; //关闭数据库 -(void)closeDB; //插入数据的接口 -(void)insertNewStudent :( StudentMode *)student; //根据某个属性查询学生 -(StudentMode *)selectStudentNumber:(NSInteger )number; //查询表中所有数据的接口 返回的是一组人 -(NSMutableArray *)selectAllStudent; //根据某个属性 删除学生 - (void)deleteStudentForNumber:(NSInteger )number; //根据学号修改学生性别的接口 -(void)updateStudent:(NSString *)gender forNumber:(NSInteger )number;
//单例的好处:
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,节约内存;
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
.m #import "DataBaseHandle.h" #import <sqlite3.h> #import "StudentMode.h" @implementation DataBaseHandle // static 静态区 只有系统结束之后 才会进行释放 static DataBaseHandle *handle = nil; +( DataBaseHandle *)shareDataBase{ @synchronized (self){ if (handle ==nil) { handle = [[DataBaseHandle alloc]init]; //让单例一创建出来 就拥有数据库的方法 // [handle openDB]; } }return handle; }
方法1 打开数据库
//打开数据库 -(void)openDB{ // 获取Documents 文件路径,因为 Documents 中放的都是比较重要的文件,并且比较小 NSString *ducumentsPath = [ NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]; // 文件路径拼接 拼接数据库文件路径student.sqlite NSString *dataPath =[ducumentsPath stringByAppendingPathComponent:@"student.sqlite"]; // NSLog(@"%@",dataPath); // 打开数据库 if 数据库文件不存在 就创建 [dataPath UTF8String] 把对象转变成了c 语言中的字符串 //这个方法执行完 会返回一个数据库对象 不再是 nil 已经被初始化 int result = sqlite3_open([dataPath UTF8String], &db); //括号里的意思:如果 result 等于 sqlite_ok 说明 SQL 执行正确 if (result ==SQLITE_OK) { NSLog(@"数据库已开启"); // 创建表格 NSString *sqlString = @"Create table if not exists Student (number integer primary key autoincrement,name text,gender text,age integer,hobby text) "; //执行 SQL 语句 int result = sqlite3_exec( db, [sqlString UTF8String], NULL, NULL, NULL); if (result ==SQLITE_OK) { NSLog(@"创建成功"); }else{ NSLog(@"失败"); } }else{ NSLog(@"数据库进入自毁程序"); } }
方法2;
//关闭数据库 -(void)closeDB{ int result = sqlite3_close(db); if (result==SQLITE_OK) { NSLog(@"欢迎下次使用"); }else{ NSLog(@"还要使用么"); } }
上面的方法 其实都是为了我们的 button 做铺垫的 因为 如果你想对数据库增删改查 就先要打开数据 然后关闭 上面就是封装好的方法
button 的功能实现1.插入
//插入数据接口
-(void)insertNewStudent :( StudentMode *)student{ //打开数据库 [self openDB]; //准备 SQL 语句 ?代表了 占位符 逗号隔开 必须的语句 NSString *sqlString = @"insert into Student(name,gender,age) values(?,?,?)"; // sqlite3 *db: 数据库指针 // const char *zSql :我们准备的 SQL 语句 // int nByte :计算 SQL 语句的长度 可以手动给 也可以设为-1 会自动计算 // sqlite3_stmt **ppStmt :管理创建 SQL 语句的类,全称: statement // const char **pzTail 预留参数 不知道会用于什么地方 给 null; sqlite3_stmt *stmt= nil; int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result ==SQLITE_OK) { // 绑定参数 // 绑定的参数:1.管理类执行对象;2.第几个问号;3.绑定的数据;4.-1;5.NULL; #warning 绑定参数的第二个参数 是从1 开始的 sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL); sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL); //NSInteger 使用 int sqlite3_bind_int(stmt, 3, (int)student.age); // 执行 SQL 语句 sqlite3_step(stmt); // 释放 stmt 占用的内存资源 sqlite3_finalize(stmt); // 关闭数据库 [self closeDB]; NSLog(@"没问题"); }else{ NSLog(@"搞错了"); } }
//查询表中所有数据的接口 返回的是一组人
-(NSMutableArray *)selectAllStudent{ [self openDB]; //准备 SQL 语句 必须的语句 NSString *sqlString = @"select *from Student"; // 创建语句管理类 sqlite3_stmt *stmt = nil; int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result ==SQLITE_OK) { //建立数据用来存储表格中的数据初始化的 student 对象 NSMutableArray *array = [NSMutableArray arrayWithCapacity:1]; //支持循环的条件: 下一行还有数据 就可以继续循环 while (sqlite3_step(stmt)==SQLITE_ROW) { // column 是列的意思 从0 开始 // 将 c 语言转回 OC 语言的方法 NSInteger number = sqlite3_column_int(stmt, 0); NSString *name = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1)]; NSString *gender = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 2)]; NSInteger age = sqlite3_column_int(stmt, 3); // 取出数据,放入模型类中 StudentMode *stu = [[StudentMode alloc]init]; stu.name = name; stu.gender = gender; stu.age =age; stu.number = number; [array addObject:stu]; [stu release]; } // stmt 占用的系统内容释放掉 sqlite3_finalize(stmt); [self closeDB]; return array; }else{ [self closeDB]; sqlite3_finalize(stmt); return nil; } }
根据属性查询学生
//根据某个属性查询学生 -(StudentMode *)selectStudentNumber:(NSInteger )number{ //打开数据库 [self openDB]; // 准备 SQL 语句 NSString *sqlString = @"select *from Student where number = ?"; // 验证 sqlite3_stmt *stmt = nil; int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result == SQLITE_OK) { NSLog(@"成功读取数据"); //绑定参数 sqlite3_bind_int(stmt, 1, (int)number); StudentMode *stu =[[[StudentMode alloc]init]autorelease]; //支持循环的条件: 下一行还有数据 就可以继续循环 while (sqlite3_step(stmt)==SQLITE_ROW) { stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)]; stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)]; stu.age = sqlite3_column_int(stmt, 3); } //清理 stmt 的内存 sqlite3_finalize(stmt); [self closeDB]; NSLog(@"学生信息已出现"); return stu; } sqlite3_finalize(stmt); [self closeDB]; NSLog(@"没有个学生啦"); return nil; }
根据属性 删除对象
//根据某个属性 删除学生 - (void)deleteStudentForNumber:(NSInteger )number{ // 打开数据库 [self openDB]; //准备 SQL 语句 NSString *sqlString = @"delete from Student where number = ?"; // 验证 sqlite3_stmt *stmt = nil; int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result ==SQLITE_OK) { // 绑定参数 sqlite3_bind_int(stmt, 1, (int)number); //执行 SQL 语句 sqlite3_step(stmt); } sqlite3_finalize(stmt); NSLog(@"已经删除了"); [self closeDB]; }
5.根据 xxx 修改学生信息
//根据学号修改学生性别的接口 -(void)updateStudent:(NSString *)gender forNumber:(NSInteger )number{ // 1.打开数据库 [self openDB]; //准备 SQL 语句 NSString *sqlString = @"update Student set gender = ? where number = ?"; //验证 sqlite3_stmt *stmt = nil; int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result ==SQLITE_OK) { // 1.绑定参数 sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL); sqlite3_bind_int(stmt, 2, (int)number); // 执行 SQL 语句 sqlite3_step(stmt); } //释放 stmt 的内存 sqlite3_finalize(stmt); [self closeDB]; }
总结;
1.方法的实现步骤几乎都是一样的
2.不要忘记打开数据库 和关闭数据库 释放 stmt
相关文章推荐
- UIAlertController的使用二
- 【IOS】 遍历info 所有内容 && 唯一的节能设备UUID
- iOS 在UILabel显示不同的字体和颜色(转)
- 将GPIUmage集成到项目中
- UIAlertController的用法
- iOS UI 第二课 UITextField UIButton
- iOS-UI-04 沙盒 归档 解归档
- 黑马程序员——自学总结(七)图形用户界面GUI
- Mapped Statements collection does not contain value for
- easyui form表单提交中文乱码
- apue-第十章 信号 笔记
- SpannableStringBuilder
- 232 Implement Queue using Stacks
- Error running 'requirements_osx_brew_update_system '
- hdoj- Windows Message Queue
- hdoj- Windows Message Queue
- UI及美术部分资源命名规范:
- Windows Message Queue(优先队列)
- map容器按value值排序
- OpenCV库highgui函数在VS2012下的内存泄露问题!