<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

简介: SQL(Structured query Lauguage) :结构化 查询 语言1.创建表格的SQL语句create table if not exists Teacher(tea_id integer pr...
SQL(Structured query Lauguage) :结构化 查询 语言

1.创建表格的SQL语句
create table if not exists Teacher(tea_id integer primary key autoincrement,tea_name text,tea_gender text,tea_age integer,tea_salary integer)
增:
2.向表中的字段下插入数据
insert into Teacher(tea_id,tea_name,tea_gender,tea_age,tea_salary)values(110,'小韩哥','男',18,1000)
查:
3.查找表格中所有的内容( * 查询老师表格中所有的数据)
select * from Teacher
4.查找表格中对应字段的所有信息(  tea_name和tea_gender 下的所有数据
select tea_name,tea_gender from Teacher
5.根据条件为小韩哥查找其信息
select *from Teacher where tea_name = '小韩哥'
改:
6.根据唯一标示符(主键)修改老师性别的信息  改数据都要通过唯一标示符去改
update Teacher set tea_gender = '女' where tea_id = 111
删:
7.根据唯一标示符(主键)删除老师性别的信息  删除数据都要通过唯一标示符去改
delete from Teacher where tea_id = 110
8.删除表格中所有的数据
delete from Teacher
9.根据表名删除整个表格
drop table Teacher
——————————————————————————————————————————————————
下面通过实际例子对数据库进行增、删、改、查:
布局如下(不再进行代码布局):4个textField 5个Button

————————————————————————————————————————
准备一个Student的model类:
Student.h
@interface Student : NSObject
@property(nonatomic,assign)NSInteger number;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *gender;
@property(nonatomic,assign)NSInteger age;
@end

Student.m
@implementation Student
- (void)dealloc{
    self.name = nil;
    self.gender = nil;
    [super dealloc];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"%ld %@ %@ %ld", self.number,self.name,self.gender,self.age];
}
@end
通过单例写接口并实现方法:
DataBaseHandle.h

@class Student;
@interface DataBaseHandle : NSObject
//创建单例的方法
+ (DataBaseHandle *)shareDataBaseHandle;
//打开数据库的方法
- (void)openDataBase;
//关闭数据库的方法
- (void)closeDataBase;
//插入学生对象的接口
- (void)insertStudent : (Student *)student;
//返回表格中所有学生的接口
- (NSMutableArray *)selectAllStudent;
//根据唯一标识学号删除学生
- (void)deleteOneStudentByNumber : (NSInteger )number;
//根据唯一标识学号修改学生的姓名
- (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number;
//根据学号查找学生
- (Student *)selectOneStudentByNumber : (NSInteger)number;
@end

DataBaseHandle.m
#import "DataBaseHandle.h"
#import <sqlite3.h>
#import "Student.h"
@implementation DataBaseHandle

static DataBaseHandle *handle = nil;

//创建单例的方法
+ (DataBaseHandle *)shareDataBaseHandle{
    @synchronized(self){
        if (handle == nil) {
            handle = [[DataBaseHandle alloc]init];
            //让单例对象一创建后就可以访问数据库
            [handle openDataBase];
            
        }
    }
    
    return handle;
}
//返回数据库路径
- (NSString *)dataBasePath{
    //将数据库文件放到Documents文件夹下 student.sqlite
      return   [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"student.sqlite"];

}

定义一个全局且在静态区的数据库指针

static sqlite3 *db = nil;

打开数据库的方法

- (void)openDataBase{
    //1.先获取数据文件的路径
    NSString *dbPath = [self dataBasePath];
    //使用sql之前一定要导入libsqlite3.0动态链接类库,其中libsqlite.3.0是快捷方式,导入快捷方式的好处,当版本更新的时候,不再导入新的实体类库了,因为快捷方式永远指向的是最新的实体类库(记得导入头文件)
    
    //2.使用sql语句打开数据库
    //[dbPath UTF8String] 将OC字符串转化为C语言字符串
    //sqlite3 就是数据库指针
    //创建数据库指针db
//    sqlite3 *db = nil;
    
    //方法执行完,内不会对数据库指针db进行初始化,方法执行完,就会存在数据库文件
    //此方法会先检测文件路径中有没有对应的数据库文件,没有则创建,有的话直接打开
   int result = sqlite3_open([dbPath UTF8String], &db);
    //SQLITE_OK 说明sql是成功
    if (result == SQLITE_OK) {
//        NSLog(@"数据库打开成功");
        
        //创建表格
        //准备sql语句
        NSString *sqlString = @"create table if not exists Student(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer)";
        //执行sql语句
        sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL);
        
    }else{
        NSLog(@"数据库打开失败");
    }
    
}

关闭数据库的方法

- (void)closeDataBase{
int result =  sqlite3_close(db);
    NSLog(@"%@",(result == SQLITE_OK) ? @"关闭成功":@"关闭失败");
}

插入学生对象的接口——增

- (void)insertStudent : (Student *)student{
    //1.打开数据库
    [self openDataBase];
    
    //2.准备插入的sql语句
    NSString *sqlString = @"insert into Student(stu_name,stu_gender,stu_age)values(?,?,?)";
    
    //3.创建数据库管理指针(数据库管理指令集)
    sqlite3_stmt *stmt = nil;
    //4.验证sql语句是否正确
    //参数1:数据库指针,
    //参数2:sql语句
    //参数3:sql语句的长度写成-1,自动计算sql语句的最大长度,否则要自己计算长度
    //参数4:sql语句的管理指针
    //参数5:预留参数,未来使用
    //5.拿验证的结果,判断是否执行参数绑定的操作
    int result =  sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"插入成功");
        //参数1:sql语句管理指针
        //参数2:上面sql语句中 ?的位置,?的下标从1开始
        //参数3:要绑定的数据
        //参数4:数据的长度
        //绑定字段stu_name 的数据
        sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL);
        //绑定字段stu_gender 的数据
        sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL);
        //绑定字段stu_age 的数据
        sqlite3_bind_int(stmt, 3, (int)student.age);
        
        //6.让sql语句执行
        sqlite3_step(stmt);
    }
    //7.释放掉管理指针
    sqlite3_finalize(stmt);
    
    //8.关闭数据库
    [self closeDataBase];
}

返回表格中所有学生的接口——查1

- (NSMutableArray *)selectAllStudent{
    //1.打开数据库
    [self openDataBase];
    //2.准备sql语句
    NSString *sqlString = @"select * from Student";
    //3.创建管家指针
    sqlite3_stmt *stmt = nil;
    //4.验证sql语句是否正确
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    if (SQLITE_OK == result) {
        NSLog(@"查找全部语句成功");
        
        //创建可变数组存储找到所有的学生对象
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
        
        //SQLITE_ROW 如果等于row说明下一行是有数据的,循环继续,如果不等于SQLITE_ROW ,说明下一行没有数据了,循环结束
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //依次读出字段的数据
            //列的编号是从零开始的
            //第一列
            int 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)];
            //第四列
            int age = sqlite3_column_int(stmt, 3);
            //5.创建学生对象并赋值
            Student *stu = [[Student alloc]init];
            stu.number = number;
            stu.name = name;
            stu.gender = gender;
            stu.age = age;
            //添加到数组
            [array addObject:stu];
            //释放
            [stu release];
            
        }
        //6.释放管理指针
        sqlite3_finalize(stmt);
        //关闭数据库
        [self closeDataBase];
        return array;
    }else{
        sqlite3_finalize(stmt);
        [self closeDataBase];
        return nil;
    }
    
}


根据学号查找学生——查2

- (Student *)selectOneStudentByNumber : (NSInteger)number{
    //1.打开数据库
    [self openDataBase];
    //2.准备sql语句
    NSString *sqlString = @"select * from Student where stu_number = ?";
    //3.创建管理指针
    sqlite3_stmt *stmt = nil;
    //4.验证sql语句是否正确
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    //5.根据验证结果决定执行什么操作
    if (result == SQLITE_OK) {
        //6.绑定参数
        sqlite3_bind_int(stmt, 1, (int)number);
        //7.遍历表格中的数据
        //创建model学生对象存储找到的学生信息
        Student *stu = [[Student alloc]init];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //根据找到的数据给学生的属性赋值
            stu.number = number;
            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);
         
        }
        //8.释放管理指针
        sqlite3_finalize(stmt);
        //9.关闭数据库
        [self closeDataBase];
        return [stu autorelease];
        
    }else{
        //10.释放管理指针
        sqlite3_finalize(stmt);
        //11.关闭数据库
        [self closeDataBase];
    }
    return nil;
}


根据唯一标识学号删除学生——删

- (void)deleteOneStudentByNumber : (NSInteger )number{
    //1.打开数据库
    [self openDataBase];
    //2.准备删除sql语句
    NSString *sqlString = @"delete from Student where stu_number = ?";
    //3.创建数据库管理指针
    sqlite3_stmt *stmt = nil;
    //4.验证sql语句是否正确
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    //5.判断是否执行参数绑定的操作
    if (result == SQLITE_OK) {
        //6.绑定传过来的参数
        sqlite3_bind_int(stmt, 1, (int)number);
        //7.执行sql语句
        sqlite3_step(stmt);
        
    }
    //8.释放掉管理指针
    sqlite3_finalize(stmt);
    //9.关闭数据库
    [self closeDataBase];
        
}


根据唯一标识学号修改学生的姓名——改

- (void)updateStudentGender : (NSString *)gender ByNumber : (NSInteger )number{
    //1.打开数据库
    [self openDataBase];
    //2.准备sql语句
    NSString *sqlString = @"update Student set  stu_gender = ? where stu_number = ?";
    //3.创建数据库管理指针
    sqlite3_stmt *stmt = nil;
    //4.验证sql语句
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    //5.根据验证的结果决定执行的操作
    if (result == SQLITE_OK) {
        //6.绑定参数
        sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL);
        //7.绑定学号
        //第二个参数:是 ? 在sql语句中位置,位置从1开始
        sqlite3_bind_int(stmt, 2, (int)number);
        //8.执行sql语句
        sqlite3_step(stmt);
       
    }
    //9.释放管理指针
    sqlite3_finalize(stmt);
    //10.关闭数据库
    [self closeDataBase];
    
}

方法的调用:

ViewController.m

#import "ViewController.h"
#import "DataBaseHandle.h"
#import "Student.h"
@interface ViewController ()
@property (retain, nonatomic) IBOutlet UITextField *numberField;//学号
@property (retain, nonatomic) IBOutlet UITextField *nameField;//姓名
@property (retain, nonatomic) IBOutlet UITextField *genderField;//性别
@property (retain, nonatomic) IBOutlet UITextField *ageField;//年龄
@end
1、添加:增

- (IBAction)insertStudent:(UIButton *)sender {
    //判断有一个控件中输入的内容为空,就不让它插入数据
    if (0 == self.nameField.text.length || 0 == self.genderField.text.length || 0 == self.ageField.text.length) {
        return;
    }
   //创建学生Student 对象,存储空间中输入的内容
    Student *stu = [[Student alloc]init];
    stu.name  = self.nameField.text;
    stu.gender = self.genderField.text;
    stu.age  = [self.ageField.text integerValue];
    
    [[DataBaseHandle shareDataBaseHandle]insertStudent:stu];
    [stu release];   
}

2、更新学生信息:改

- (IBAction)updateStudent:(UIButton *)sender {
    //获取输入框的内容
    NSInteger number = [self.numberField.text integerValue];
    NSString *gender = self.genderField.text;
    //调用根据学号修改gender的方法
    [[DataBaseHandle shareDataBaseHandle]updateStudentGender:gender ByNumber:number];
}


3、删除学生:删

- (IBAction)deleteStudent:(UIButton *)sender {
    NSInteger number = [self.numberField.text integerValue];
    //调用根据学号删除学生的方法
    [[DataBaseHandle shareDataBaseHandle]deleteOneStudentByNumber:number];
}


4、查找全部学生:查1

- (IBAction)selectAllStudent:(UIButton *)sender {
    //调用寻找所有学生
  NSMutableArray *contentArray =  [[DataBaseHandle shareDataBaseHandle]selectAllStudent];
    for (Student *stu in contentArray) {
        NSLog(@"%@",stu);
    }
    
}


5、查找某个学生:查2

- (IBAction)selectOneStudent:(id)sender {
    //获取学号输入框的内容
    NSInteger number = [self.numberField.text integerValue];
    //调用根据学号获取学生对象
    Student *stu =  [[DataBaseHandle shareDataBaseHandle]selectOneStudentByNumber:number];
    NSLog(@"%@",stu);
}

记得释放:

- (void)dealloc {
    [_numberField release];
    [_nameField release];
    [_genderField release];
    [_ageField release];
    [super dealloc];
}

总结 一般步骤:1、打开数据库;2、准备sql语句;3、创建管家指针;4、验证sql语句是否正确;5、根据验证结果决定执行什么操作;6、绑定参数;7、遍历表格中的数据(根据学号查找学生);8、释放管理指针;9、关闭数据库

目录
相关文章
什么时候使用PUT?什么时候使用POST?具体使用场景是什么?
什么时候使用PUT?什么时候使用POST?具体使用场景是什么?
726 0
|
6月前
|
关系型数据库 MySQL 弹性计算
部署LAMP环境(Alibaba Cloud Linux 3)
本教程提供在阿里云云服务器ECS上基于Alibaba Cloud Linux 3操作系统搭建LAMP环境的指引。LAMP是应用广泛的网站服务系统,由四种免费的开源软件Linux、Apache、MySQL和PHP组成。搭建好LAMP环境后,您可以在该ECS实例上搭建网站、访问网站、搭建开发环境等。
95518 65
部署LAMP环境(Alibaba Cloud Linux 3)
ERROR: libopenjp2 = 2.1.0 not found using pkg-config
ERROR: libopenjp2 = 2.1.0 not found using pkg-config
473 0
|
缓存 NoSQL Java
解决Redis报错Redis is configured to save RDB snapshots, but it is currently not able to persist on disk
解决Redis报错Redis is configured to save RDB snapshots, but it is currently not able to persist on disk
1738 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
负载均衡: LVS(Layer 4), HAProxy(Layer 4、 7),Nginx(Layer 7) 虚拟化: LXC、KVM、Xen HA:Keepalived、Heartbeat 分布式缓存...
735 0
|
7天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
7天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
8天前
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动有啥不同?
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
115093 1
|
9天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101867 3
|
6天前
|
物联网 PyTorch 测试技术
手把手教你捏一个自己的Agent
Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。