_水丹青

UI数据库

一、数据库

SQL: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集, 是一种功能齐全的数据库语言

二、数据库管理系统

数据库特征:

1.以一定方式存储在一起

2.能为多个用户共享

3.具有尽可能少的冗余代码

4.与程序彼此独立的数据集合

三、表

表是数据库中一个非常重要的对象, 是其他对象的基础根据信息的分类情况, 一个数据库中可能包含若干个数据表

 

记录:是指对应于数据表中的一行信息的一组完整的相关信息

 

SQL字段的约束条件:

NOT NULL - 非空 (除主键以外, 其余任何字段都允许为空)

UNIQUE - 唯一 (表示确定的,只有一个该字段)

PRIMARY KEY - 主键 (不能为空, 唯一, 在一个表中最好设置主键)

FOREIGN - 外键 (数据库中有连表查询功能, 另外一张表的主键就是当前表的外键)

CHECK - 条件检查, 确保一列中的所有值满足一定条件 (CHECK在满足条件时会用到)

DEFAULT - 默认 (默认的)

AOTOINCREMENT - 自增型变量 (当设置一个integer类型的数据字段, 下一条会自增1)

 

SQL语句:

1.建表命令 (Create Table)

语法:
create table 表名(字段1 约束1 约束2, 字段2 约束1 约束2);

需求: 创建一个student表, 表中的字段有学号, 姓名, 年龄, 学号的约束条件: 作为主键, 自增, 不能为空; 姓名默认为'无名氏'; 年龄大于16岁

create table student (s_id integer primary key autoincrement not null, s_name text default '无名氏', s_age integer check (s_age > 16));

2.数据插入命令 (Insert)

语法:
insert into 表名 (字段1, 字段2, 字段3) values (值1, 值2, 值3);

事例:插入学生姓名, 年龄

insert into student (s_name, s_age) values ('二芳', 30);
insert into student (s_name, s_age) values ('wq', 26);

3.数据库更新命令 (Update)

语法:
update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2 where 条件;

事例:

update student set s_age = 25 where s_age = 18;

4.数据库删除命令 (Delete)

语法:
delete from 表名 where 条件;

需求: 删除年龄为10岁的学生

delete from student where s_age = 10;

 因为表中没有年龄为10岁的学生, 故查找不到

5. 数据库检索命令 (Select)

语法:
select 要查找的字段 from 表名 where 条件

需求:查询姓名为二芳的所有信息

select * from student where s_name = '二芳';

 

在Xcode中对数据库进行操作

DataBase.h

 

#import <Foundation/Foundation.h>

@interface DataBaseHandle : NSObject

//把该类写成单例, 方便外部使用
+ (DataBaseHandle *)shareDataBaseHandle;

//打开数据库
- (void)openDB;

//关闭数据库
- (void)closeDB;

//创建表
- (void)createTable;

//插入数据
- (void)insertName:(NSString *)name
            gender:(NSString *)gender
               age:(NSInteger)age;

//通过uid更新数据
- (void)updateWithUID:(NSInteger)uid;

//根据uid删除数据
- (void)deleteWithUID:(NSInteger)uid;

//查找所有数据
- (void)searchAll;

//根据名字去查找相关的数据信息
- (void)searchWithName:(NSString *)name;
@end

 

 DataBase.m

#import "DataBaseHandle.h"
//引入数据库操作的头文件
#import <sqlite3.h>
static DataBaseHandle *dataBase = nil;

@interface DataBaseHandle()

///数据库的存储路径
@property (nonatomic, copy) NSString *dbPath;

@end

@implementation DataBaseHandle

//懒加载需要给数据库路径赋值
- (NSString *)dbPath {
    if (_dbPath == nil) {
        
        //需求: 路径存储在Documents文件夹下, 数据库文件为person.sqlite
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"];
    }
    return _dbPath;
}
+ (DataBaseHandle *)shareDataBaseHandle {
    
    if (dataBase == nil) {
        dataBase = [[DataBaseHandle alloc]init];
    }
    return dataBase;
}

//数据库使用的场所有很多, 所以初始化一个数据库的静态变量
static sqlite3 *db = nil;
- (void)openDB {
    
    //打开数据库, 使用int去接收打开的结果
    //第一个参数: filename代表数据库的存储路径
    //第二个参数: 二级指针, 数据库的地址
    int result = sqlite3_open([self.dbPath UTF8String], &db);
    
    //result是个枚举值, 有很多种情况
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
    }else {
        NSLog(@"数据库打开失败");
    }
}

- (void)closeDB {
    
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
    }else {
        NSLog(@"数据库关闭失败");
    }
}

- (void)createTable {
    //创建一个person表, 字段:uid integer类型 主键 自增 不能为空, name text类型, gender text类型, age integer类型
    NSString *createStr = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)";
    
    //第一个参数: 数据库
    //第二个参数: sql语句, 需要进行编码
    //第三个参数: 结果回调的一个函数
    //第四个参数: 回调函数的一个参数
    //第五个参数: 错误信息
    int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else {
        NSLog(@"创建表失败");
    }
    //打印数据库的路径, 检查表是否创建成功
    NSLog(@"_dbPath = %@", _dbPath);
}

- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age {
    
    //当values不确定的情况下使用'?'代替, 之后会进行值绑定的过程
    NSString *insertStr = @"insert into person (name, gender, age) values (?, ?, ?)";
    
    //伴随指针
    sqlite3_stmt *stmt = nil;
    //预执行语句
    //第一个参数: 要插入的数据库
    //第二个参数: sql语句
    //第三个参数: 有正、负之分, 如果为正: 向后读对应字节数, 如果为负: 遇到特殊符号才会结束读取 (\000, u000)
    //第四个参数: 伴随指针, 会随着数据库的相关操作确定其中'?'的值
    //第五个参数: 取值的时候取的不全, 剩下的值都存在这里
    int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL);
    
    //判断执行结果
    if (result == SQLITE_OK) {
        
        //如果执行成功, 则对'?'进行值绑定
        //第一个参数: 伴随指针
        //第二个参数: 代表'?'的位置, 从1开始
        //第三个参数: 表示要插入的值
        //第四个参数: 同上边的-1
        //第五个参数: 回调函数
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);
        sqlite3_bind_int64(stmt, 3, age);
        
        //sql语句执行完毕
        //执行伴随指针, 根据伴随指针的情况判定是否插入成功,[SQLITE_DONE]代表伴随指针执行数据成功
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"插入成功");
        }else {
            NSLog(@"插入失败");
        }
        
    }else {
        NSLog(@"result = %d", result);
    }
    
    //释放伴随指针
    sqlite3_finalize(stmt);
}

- (void)updateWithUID:(NSInteger)uid {
    
    NSString *updateStr = @"update person set name = '悟空' where uid = ?";
    
    sqlite3_stmt *stmt = nil;
    
    int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_int64(stmt, 1, uid);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"更新数据成功");
        } else {
            NSLog(@"更新数据失败");
        }
    } else {
        NSLog(@"result = %d", result);
    }
    
    sqlite3_finalize(stmt);
}

- (void)deleteWithUID:(NSInteger)uid {
    
    NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
    
    int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL);
    
    if (result == SQLITE_OK) {
        NSLog(@"删除数据成功");
    }else {
        NSLog(@"删除数据失败");
    }
    
}

- (void)searchAll {
    
    NSString *selectAllStr = @"select * from person";
    
    sqlite3_stmt *stmt = nil;
    
    //预执行
    int result = sqlite3_prepare(db, selectAllStr.UTF8String, -1, &stmt, NULL);
    
    if (result == SQLITE_OK) {
        //查询数据的时候当不知道有多少次的时候使用while循环
        //sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            
            //第一个: 参数伴随指针
            //第二个参数: 代表这个字段的位置[只有带'?'的是从1开始, 其余都是从0开始]
            int uid = sqlite3_column_int(stmt, 0);
            NSLog(@"uid = %d", uid);
            
            //在OC代码中要使用数据库的相关内容, 应该使用utf-8
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSLog(@"name = %@", name);
            
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            NSLog(@"%@", gender);
            
            int age = sqlite3_column_int(stmt, 3);
            NSLog(@"%d", age);
        }
    }else {
        NSLog(@"result = %d", result);
    }
    
    sqlite3_finalize(stmt);
}

- (void)searchWithName:(NSString *)name {
    
    NSString *searchStr = @"select uid, gender, age from person where name = ?";
    
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL);
    
    if (result == SQLITE_OK) {
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            
            int uid = sqlite3_column_int(stmt, 0);
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            int age = sqlite3_column_int(stmt, 2);
            NSLog(@"uid = %d, gender = %@, age = %d", uid, gender, age);
        }
    }else {
        NSLog(@"result = %d", result);
    }
    
    sqlite3_finalize(stmt);
    
}
@end

 ViewController.m

#import "ViewController.h"
#import "DataBaseHandle.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    DataBaseHandle *dataBaseHandle = [DataBaseHandle shareDataBaseHandle];
    
    //打开数据库
    [dataBaseHandle openDB];
    
//    [dataBaseHandle closeDB];
    [dataBaseHandle createTable];
    
    //插入数据
    [dataBaseHandle insertName:@"芳芳女神" gender:@"美女" age:25];
    
    //更新数据
    [dataBaseHandle updateWithUID:1];
    
    [dataBaseHandle deleteWithUID:1];
    
    [dataBaseHandle searchAll];
    
    [dataBaseHandle searchWithName:@"芳芳女神"];
}

 

posted on 2016-05-04 23:29  大一号  阅读(454)  评论(0编辑  收藏  举报

导航