//
//  ViewController.m
//  01-sqlite3的基本使用
//
//  Created by 鹿微微鹿
//  Copyright (c) 2016年 鹿微微鹿. All rights reserved.
//
//使用数据库的步骤ios使用的数据库是sqlite3
//UIKi框架并不支持sqlite3,需要导入一个支持sqlite的库
//1.创建一个数据库文件,如果已经有了只需要打开数据库文件
//2.创建一张表
//3.对表的数据进行增删改查


#import "ViewController.h"
#import <sqlite3.h>
@interface  ViewController (){
    //声明一个数据库变量
sqlite3
}

@end 

@implementation

- (void)viewDidLoad {
    [super viewDidLoad];
  
    //1.创建数据库
self createDB];

    //2.创建表
    [self createTable];
    
    //3.插入数据
    [self insertData];
    
    //4.删除数据
    [self deleteData];
    
    //5.更新数据
    [self updateData];
    
    //6.查找数据
    [self selectData];
}




#pragma mark - 创建/打开数据库
- (void) createDB{
    
    //1.创建数据库的路径(实际开发过程中是沙盒目录下的一个路径);
    const char * path = "/Users/IOS1601/Desktop/my files/网络第一周/day6-数据库/数据库文件/user.sqlite";
    
    //2.打开一个数据库文件(如果数据库不存在就创建一个新的);
    //参数1:数据库文件的路径
    //参数2:指向数据库的指针的地址,代表当前打开或者创建的数据库
    //返回值:打开或者创建是否成功
int ret = sqlite3_open(path, &_db);
    //3.判断数据库打开创建是否成功
    //SQLITE_OK专门用来判断数据库操作成功的宏
if (ret == SQLITE_OK) {
        
        NSLog(@"数据库打开/创建成功");
        
else{
        
        NSLog(@"数据库打开/创建失败");
        
    }
}
#pragma mark - 创建表
- (void)createTable{
    
    //1.创建一个创建表的sql语句
    const char *sql = "CREATE TABLE  IF NOT EXISTS  t_user(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL DEFAULT 22,score real DEFAULT 0); ";
    //sqlite3_exec 专门用来执行DDL,DML语句的方法
    //DQL语句不可以使用这个函数;
    //参数1:数据库(必须是已经打开的数据库);
    //参数2:需要执行的sql语句
    //参数5:错误信息
    //返回值:是否成功执行sql语句
    //2.执行创建表的sql语句;
int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    
    //3.判断表是否创建成功
if (ret == SQLITE_OK) {
        
NSLog(@"创建成功");
else{
        
NSLog(@"创建表失败");
    }
    
    
}

#pragma mark - 插入数据
- (void) insertData{
    //1.创建插入数据的sql语句
    const char *sql = "INSERT INTO t_user (name,age,score) VALUES ('fanjuan',22,99);";
    
    
    //一次插入多条数据
    NSMutableString *mstr = [NSMutableString string];
    
for (int i=0; i<20; i++) {
        NSString *str = [NSString stringWithFormat:@"INSERT INTO t_user (name,age,score) VALUES ('fanjuan%d',%d,%f);",i,arc4random() % 10 + 10,(float)(arc4random()%101)];
        
appendString:str];
    }
    
const char *sql2 = [mstr UTF8String];
    //2.执行插入数据的sql语句
int ret = sqlite3_exec(_db, sql2, NULL, NULL, NULL);
    
    
    
    //3.判断是否成功
if (ret == SQLITE_OK) {
NSLog(@"插入数据成功");
else{
NSLog(@"插入数据失败");
    }
    
    
}
#pragma mark - 删除数据
- (void) deleteData{
    
    //1.创建sql语句
    const char *sql = "DELETE FROM t_user WHERE name ='fanjuan';";
    
    //2.执行sql语句
int ret =   sqlite3_exec(_db, sql, NULL, NULL, NULL);
    
    //3.判断是否成功
if (ret == SQLITE_OK) {
NSLog(@"删除数据成功");
else{
NSLog(@"删除数据失败");
    }
    
}
#pragma mark - 更新数据
- (void)updateData{
    
    //1.创建sql语句
    const char *sql = "UPDATE t_user SET score = 99 WHERE score < 80;";
    
    //2.执行sql语句
int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    
    //3.判断是否成功
if (ret == SQLITE_OK) {
NSLog(@"更新数据成功");
else{
NSLog(@"更新数据失败");
    }
    
}
#pragma mark 查询数据
- (void)selectData{
    
    //1.创建sql语句
    const char *sql = "SELECT * FROM t_user;";
    
    //2.执行语句
    //参数1:数据库
    //参数2:数据查询的sql语句
    //参数3:sql语句的长度(传入-1自动计算)
    //参数4:结果集(专门用来存放结果的容器)
    //参数5:null

   // 创建存放结果集指针
    sqlite3_stmt *stmt;
    int ret=  sqlite3_prepare_v2(_db
1, &stmt, NULL);
    //3.判断查询是否成功;
if (ret == SQLITE_OK) {
        
NSLog(@"查询成功");
    
    //将数据从结果 集中拿出来
        //遍历结果集中的数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
            
//拿到查询结果的数据
//参数1:结果集指针
            //参数2:列标号(从0开始)
const unsigned   char *name = sqlite3_column_text(stmt,1);
            
int age = sqlite3_column_int(stmt,2);
            
double score = sqlite3_column_double(stmt, 3);
NSLog(@"%s-%d-%.2lf",name,age,score);
            
        }
        
    
else{
NSLog(@"查询失败");
    }
    
    
    
}
@end