iOS之SQL语句详解

来源:互联网 发布:卡祖笛淘宝 编辑:程序博客网 时间:2024/06/07 07:17

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]; } */
1 0