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、关闭数据库

iOS中 DataBase SQL数据库 UI_高级的更多相关文章

  1. iOS - SQLite Database 操作数据库

    iOS - SQLite Database 操作数据库   Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...

  2. IOS中使用轻量级数据库

    IOS中使用轻量级数据库 目录 概述 IOS中的轻量级数据库 sqlite的方法 数据库的实用操作 第三方类库 FMDatabase 概述 IOS中的轻量级数据库 sqlite的方法 sqlite3 ...

  3. SQL数据库— <3>高级查询、常用函数 --摘录网络

    SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; --all 查询所有 ...

  4. Unity中对SQL数据库的操作

    在Unity中,我们有时候需要连接数据库来达到数据的读取与储存.而在.NET平台下,ADO.NET为我们提供了公开数据访问服务的类.客户端应用程序可以使用ADO.NET来连接到数据源,并查询,添加,删 ...

  5. 关于Golang中database/sql包的学习

    go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...

  6. 李洪强iOS开发之-sql数据库的使用

    一,创建工程 二: 导入头文件 三:导入 四: 数据库增删改查 //因为是结构体类型,所以用assign //1.创建数据库(保存路径) @property(nonatomic,assign)sqli ...

  7. Oracle配置OneMap中的sql数据库问题及解决方案

    报错ORA-00900:无效SQL语句,点确定后报错:ORA--00942:表或视图不存在 分析:prompt在Oracle中是打印功能,如果要在PLsql中执行带有prompt的sql文件就会报上面 ...

  8. Golang中database/sql包

    驱动 github.com/go-sql-driver/mysql 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. d ...

  9. ASP.NET中操作SQL数据库

    在WebConfig中配置数据库连接字符串,代码如下: <connectionStrings>         <add name="ConnectionString&qu ...

随机推荐

  1. Linux——makefile编写

    以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...

  2. 安装redis 执行make命令时报错解决方法

    一.未安装GCC 解决方法:执行yum install gcc-c++命令安装GCC,完成后再次执行make命令 yum install gcc-c++ Linux无法连接网络 http://www. ...

  3. c++ 深入理解数组

    阅读前提:你得知道啥是数组. 本文需要弄清楚的问题如下: 1,数组作为函数参数,传入的是值,还是地址? 2,数组作为函数参数,数组的长度能否确定? 解决如下 1,数组作为函数参数,传入的是地址.因为数 ...

  4. JavaScript原型与原型链

    一.数据类型 JavaScript的数据类型可以分为基本数据类型和引用数据类型. 基本数据类型(6种) String Number Boolean null undefined Symbol(ES6) ...

  5. Node.js HTTP

    稳定性: 3 - 稳定 使用 HTTP 服务器或客户端功能必须调用 require('http'). Node 里的 HTTP 接口支持协议里原本比较难用的特性.特别是很大的或块编码的消息.这些接口不 ...

  6. 使用Spring实现定时任务

    一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可 ...

  7. 在Spring Boot中输出REST资源

    前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Bo ...

  8. 干货!Android Studio快捷键VS Eclipse快捷键~亲测!

    eclipse as 英文描述 中文描述 ctrl+shift+r ctrl+shift+r Navigate->File 找工作空间的文件 ctrl+shift+t ctrl+shift+t ...

  9. 如何编写入门级redis客户端

    概述 Redis是开源的.基于内存的数据结构存储系统,可用作数据库.缓存以及消息代理方面.Redis支持许多种数据结构,并内置了丰富的诸如冗余.脚本.事务.持久化等功能,深受业界喜爱,被各种业务系统广 ...

  10. 关于Windows下程序执行的说明

    估计有很多人首次都是通过Windows(微软的操作系统)来使用计算机的,Windows的设计导致很多人认为所有程序只要双击一下就可以被正确执行了,所以一大堆初学程序设计的童鞋就会遇到些疑问: 为什么双 ...