您的位置:首页 > 产品设计 > UI/UE

IOS--UI--LessonDataBase

2015-07-28 18:58 399 查看
数据库的增删改查

首先用 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: