SQL的使用步骤大致都差不多,接下来的这些方法能带你学习实用的SQL语句和函数的使用

//  需要在静态区定义一个指针 (让这个指针指向的对象 从程序开始到结束 一直存在 程序结束后被系统自动释放)
static sqlite3 *db = nil;

//  打开数据库
- (sqlite3 *)openDB {
    //  判断数据库是否存在 如果存在直接返回
    //  不存在 则创建一个并打开
    if (db != nil) {
        return db;
    }
    //  不存在 则创建一个并打开
    //  获取路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    //  拼接数据库文件路径(拼接的数据库文件的名字)
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"/Student.sqlite"];
    NSLog(@"%@",dbPath);
    //  创建或者打开数据库
    //  参数1 文件路径(需要把oc的字符串 转化成C语言的) dbPath.UTF8String
    //  参数2 数据库的地址
    //  接收一下返回值 判断是否打开成功
    int result = sqlite3_open(dbPath.UTF8String, &db);

    //  不为SQLITE_OK时 可以查表得到错误
    if (result == SQLITE_OK) {
        NSLog(@"打开成功");
    } else {
        NSLog(@"打开失败");
    }
    return db;

}

//  关闭数据库
- (void)closeDB {
    int result = sqlite3_close(db);
    //  判断是否关闭成功
    if (result == SQLITE_OK) {
        NSLog(@"关闭成功");

        //  把数据库的指针 重置为空
        db = nil; //  如果关闭后没有置空 会导致野指针
    } else {
        NSLog(@"关闭失败");
    }
}


//  创建一张表
- (void)createTable {
    //  注意:一定要在操作时 先打开数据库
    //   操作完毕关闭数据库

    //  打开数据库
    db = [self openDB];
    //  1.写sql语句
    NSString *sql = @"create table IF Not exists LanOuStudent(number integer primary key not null,name text not null,gender text not null, age integer not null, imageData BLOB not Null)";
    //  2.执行sql语句
    //  准备与执行的操作
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建成功");
    }
    else {
        NSLog(@"创建列表失败");
    }

    //  关闭数据库
    [self closeDB];
}

//  插入数据
- (void)insertTableWithStudent:(LanOuStudent *)student {
    //  打开数据库
    db = [self openDB];

    //  写sql语句
    NSString *sql = @"insert into LanOuStudent(number, name, gender, age, imageData) values(?,?,?,?,?)";

    //  创建一个跟随指针(指令集) sqlite3_stmt
    sqlite3_stmt *stmt = nil;

    //  执行sql语句
    //  预执行函数 需要用跟随指针 绑定语句中的"?"
    //  然后一步一步执行(判断sql是否正确)
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {

        //  绑定"?" 根据sql语句中的顺序来决定绑定"?"的顺序
        //  注意: 绑定的顺序 从1开始

        //  参数1 :跟随指针
        //  参数2 :绑定的顺序
        sqlite3_bind_int(stmt, 1, (int)student.number);
        sqlite3_bind_text(stmt, 2, student.name.UTF8String, -1, NULL);
        sqlite3_bind_text(stmt, 3, student.gender.UTF8String, -1, NULL);
        sqlite3_bind_int(stmt, 4, (int)student.age);
        //  绑定二进制数据(获取其中的内容)
        //  参数3:  [student.imageData bytes]
        //  相当于获取到data的内容
        //  参数4:  (int)[student.imageData length]
        //  相当于获取到data的数据的长度
        sqlite3_bind_blob(stmt, 5, [student.imageData bytes], (int)[student.imageData length], NULL);

        //  执行绑定的语句
        sqlite3_step(stmt);

        NSLog(@"插入成功");
    } else {
        NSLog(@"插入失败");
    }

    //  不管插入是否成功 都要释放跟随指针
    sqlite3_finalize(stmt);

    //  关闭数据库
    [self closeDB];
}

//  删除数据(根据一个条件删除)
- (void)deleteWithAge:(NSInteger)age {
    //  打开数据库
//    db = [self openDB];

#pragma mark -- 不绑定删除 (需要拼接sql语句)
//    //  写SQL语句
//    NSString *sql = [NSString stringWithFormat:@"delete from LanOuStudent where age > '%ld'",age];
//    
//    //  执行sql语句
//    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
//    
//    //  判断一下执行结果
//    if (result == SQLITE_OK) {
//        NSLog(@"删除成功");
//    } else {
//        NSLog(@"删除失败");
//    }
//    
//    //  关闭数据库
//    [self closeDB];

#pragma mark -- 绑定删除法
    //  打开数据库
    db = [self openDB];

    // 写sql语句
    NSString *sql = @"delete from LanOuStudent where age > ?";

    //  创建跟随指针
    sqlite3_stmt *stmt = NULL;

    //  预执行语句
    int result = sqlite3_prepare(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        //  绑定问号
        sqlite3_bind_int(stmt, 1, (int)age);

        //  执行跟随指针 绑定的语句
        sqlite3_step(stmt);

        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");

    }

    // 不管成功与否 都要释放跟随指针
    sqlite3_finalize(stmt);
    [self closeDB];
}


//  更新
- (void)updataAge:(NSInteger)age byName:(NSString *)name {
    //  打开数据库
    db = [self openDB];
    //  写sql语句
    NSString *sql = [NSString stringWithFormat:@"update lanOuStudent set age = '%ld' where name = '%@'",age, name];
    //  执行sql语句
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"更新成功");
    } else {
        NSLog(@"更新失败");
    }
    //  关闭数据库
    [self closeDB];
}

//  查询数据(根据条件查询)
- (LanOuStudent *)selectStudentWithName:(NSString *)name age:(NSInteger)age {
    //  打开数据库
    db = [self openDB];
    //  写sql语句
    NSString *sql = @"select * from lanOuStudent where name = ? and age = ?";

    //  创建跟随指针
    sqlite3_stmt *stmt = NULL;

    //  创建一个对象
    LanOuStudent *student = [[LanOuStudent alloc] init];

    //  预执行sql
    int result = sqlite3_prepare(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        //  绑定"?"
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        sqlite3_bind_int(stmt, 2, (int)age);
        //  查询时 SQLITE_ROW
        //  如果下一行准备好了 返回SQLITE_ROW
        //  这是可以继续查询
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //  读取数据
            //  int iCol 列数
            //  如果你查询所有的字段 那么这个列数 就根据你创建表的顺序一样
            //  注意: 从0开始

            //  如果你查询的是特定的字段 那么这个列数 就要根据你的sql语句来写
            //  也是 从0开始
            int number = sqlite3_column_int(stmt, 0);
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *)sqlite3_column_text(stmt, 2);
            int age = sqlite3_column_int(stmt, 3);

            //  读取二进制数据
            NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
            //  赋值model
            //  stringWithUTF8String  把c语言字符串 转化成oc字符串
            student.name = [NSString stringWithUTF8String:name];
            student.number = number;
            student.gender = [NSString stringWithUTF8String:gender];
            student.age = age;
            student.imageData = imageData;
        }
        NSLog(@"查询成功");
    } else {
        NSLog(@"查询失败");
    }
    //  释放跟随指针
    sqlite3_finalize(stmt);
    //  关闭数据库
    [self closeDB];
    return student;
}

//  查询所有(返回一个数组)
- (NSArray *)selectAllStudents {
    //  打开数据库
    db = [self openDB];
    //  写sql语句
    NSString *sql = @"select * from lanOuStudent";
    //  创建一个可变数组备用
    NSMutableArray *stuArray = [NSMutableArray array];
    //  创建跟随指针
    sqlite3_stmt *stmt = nil;
    //  预执行
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //  读取数据
            int number = sqlite3_column_int(stmt, 0);
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *)sqlite3_column_text(stmt, 2);
            int age = sqlite3_column_int(stmt, 3);

            //  读取二进制数据
            NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];

            //  赋值model
            LanOuStudent *student = [[LanOuStudent alloc] init];
            student.name = [NSString stringWithUTF8String:name];
            student.number = number;
            student.gender = [NSString stringWithUTF8String:gender];
            student.age = age;
            student.imageData = imageData;
            //  添加到数组
            [stuArray addObject:student];
            [student release];
        }
        NSLog(@"成功");
    } else {
        NSLog(@"失败");
    }
    //  释放跟随指针
    sqlite3_finalize(stmt);
    //  关闭数据库
    [self closeDB];
    return stuArray;
}

#pragma mark -- data数据插入和没有的区别
/*
 //  (1) 如果有data数据进行插入的话
 //  sqlite3_exec 这个函数会把data数据转化成字符串存入数据库
 //  (2) 如果插入的数据没有data数据的话 直接用sqlite3_exec这个函数插入数据就行 不需要绑定

 如果使用  sqlite3_exec
 NSString *sql = @"insert into lanOuStudent(number, name, gender, age, imageData) values('%ld','%@','%@','%ld')";

 - (void)text:(LanOuStudent *)student {
 NSString *sql = @"insert into lanOuStudent(number, name, gender, age, imageData) values('%ld','%@','%@','%ld')";

 NSString *sqlNew = [NSString stringWithFormat:@"insert into lanOuStudent(number, name, gender, age, imageData) values('%ld','%@','%@','%ld')", student.number,student.name,student.gender,student.age];
 }


 */