使用SQL语句 进行数据持久化

来源:互联网 发布:三星手机系统优化 编辑:程序博客网 时间:2024/06/05 04:52

//使用SQL 需要先引入 sqlite3.h 头文件  7.0之前的版本和之后的版本引入的文件 后缀名不一样 7.0版本是libsqlite3.0.tbd 之前的版本都是libsqlite3.0.dylib


#import <sqlite3.h>

#import <Foundation/Foundation.h>

@interface SQLiteManager : NSObject

//使用SQLite数据库步骤
//1.引入 sqlite3.0框架
//2.在数据库操作类里 引入<sqlite3.h>头文件

//注意:咱们使用的函数都在这个头文件中

//创建一个单例类 使用SQl语句

//

+ (SQLiteManager *)shareManager{
    //静态区指针
    static SQLiteManager *manager = nil;
    if (manager == nil) {
        manager = [[SQLiteManager alloc]init];
        
        //调用创建表的方法
        
        [manager createTable];
        
    }
    //不需要手动释放 程序运行结束 自动释放
    return manager;
}



//需要在静态区定义一个指针指向数据库(让这个指针指向的对象 从程序开始到结束一直存在 程序结束后 被系统自动释放)

//手敲 sqlite 的时候 一开始不出提示 多来两次 就可以了

//创建一个空的sql指针

static sqlite3 *db = nil;

//打开数据库

- (sqlite3 *)openDB{
    //判断数据库 是否存在 如果存在直接返回
    //不存在 则创建 并打开
    if (db != nil) {
        return db;
    }else{
    
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        //拼接数据库文件路径(拼接的数据库文件的名字)
        NSString *dbPath = [documentPath stringByAppendingPathComponent:@"/Students.sqlite"];
        NSLog(@"%@",dbPath);
    //创建 或者 打开 数据库
    //<#const void *filename#> 参数1  文件的路径(需要把OC的字符串 转化成C语言的)
        // dbPath.UTF8String 把OC的 转化成 C语言的
    //<#sqlite3 **ppDb#> 参数2 数据库的地址
        
        //接收一下返回值 判断 是否打开成功
      int result = sqlite3_open(dbPath.UTF8String,&db);
        //可以查表得到错误
        if (result == SQLITE_OK) {
            NSLog(@"OK");
        } else {
            NSLog(@"打开失败");
            NSLog(@"%d",result);

        }
    }
    
    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 student(number integer primary key not null,name text not null,sex 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(@"建表失败");
        NSLog(@"%d",result);
    }
    [self closeDB];
}

//关闭数据库

//插入数据

- (void)inserttableWithStudent:(Student *)student{

    //打开数据库
    db = [self openDB];
    
//    写语句
    NSString *sql = @"insert into student(number, name, sex, age, imageData) values(?,?,?,?,?)";
//    创建一个跟随指针 (指令集)
    sqlite3_stmt *stmt = nil;
//    执行sql语句
//    预执行 需要用跟随指针 绑定 问号
//    然后一步 一步 执行(可以判断sql 语句 是否正确)
   int resulet = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    
    if (resulet == SQLITE_OK) {
        NSLog(@"成功插入");
//        绑定问号(根据sql语句 决定绑定的顺序)
//        注意绑定的顺序从 1 开始
//        参数2 绑定顺序
//        参数3 要插入的值
        
//        (int)student.imageData.length 相当于获取到data数据的长度
        sqlite3_bind_int(stmt, 1, (int)student.number);
        sqlite3_bind_text(stmt, 2, student.name.UTF8String, -1, NULL);
        sqlite3_bind_text(stmt, 3, student.sex.UTF8String, -1, NULL);
        sqlite3_bind_int(stmt, 4, (int)student.age);
        sqlite3_bind_blob(stmt, 5, student.imageData.bytes, (int)student.imageData.length, NULL);
//        执行绑定的语句
        sqlite3_step(stmt);
        
    } else {
        NSLog(@"插入失败");
        NSLog(@"%d",resulet);
    }

//        不管插入是否成功 都要释放跟随指针 防止内存泄露
        sqlite3_finalize(stmt);
//        关闭数据库
        [self closeDB];
/*
    如果有data数据 进行插入 这个函数会把data数据转化成字符串 存入数据库
    如果你插入的数据没有data数据 是可以直接用 sqlite3_exec 插入数据就行 不用绑定

        NSString *sql = @"insert into student(number, name, sex, age, imageData) values('%ld','%@','%@','%ld',)";
 
 
 
    
*/
    

}

//- (void)text:(Student *)stu{
//    NSString *sql = @"insert into student(number, name, sex, age, imageData) values('%ld','%@','%@','%ld',)";
//    NSString *sqlNew = [NSString stringWithFormat:@"insert into student(number, name, sex, age) values('%ld','%@','%@','%ld',)",stu.number,stu.name,stu.sex,stu.age];
//}

//  删除数据 根据一个条件删除
- (void)deleteWithAge:(NSInteger)age{

//    打开数据库
    [self openDB];
    
#pragma -- mark 不绑定删除 需要拼接sql语句
//    写语句
//    NSString *sql = @"delete from student where age > '%ld'";
//    NSString *sqlNew = [NSString stringWithFormat:@"delete from student where age > '%ld'",age];
////    执行sql语句
//    int result = sqlite3_exec(db, sqlNew.UTF8String, NULL, NULL, NULL);
//    if (result == SQLITE_OK) {
//        NSLog(@"删除成功");
//    } else {
//        NSLog(@"删除失败");
//        NSLog(@"%d",result);
//    }
//    //关闭数据库
//    [self closeDB];
#pragma -- mark 绑定删除
//    打开数据库
    db = [self openDB];
//    写sql语句
    NSString *sql = @"delete from student where age > ?";
//    创建跟随指针
    sqlite3_stmt *stmt = nil;
    //预执行语句
   int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"成功");
//        绑定问号
        sqlite3_bind_int(stmt, 1, (int)age);
        sqlite3_step(stmt);
    } else {
        NSLog(@"失败");
        NSLog(@"%d",result);
    }
    //不管成功与否 都要 释放跟随指针
    sqlite3_finalize(stmt);
    //关闭数据库
    [self closeDB];
    
}


//  更新数据(根据一个条件来更新)

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

//  查询语句(根据条件查询)

//5.查询语句

//where 根据条件查询  多条件用 and 连接
//*表示 查询所有字段
//
//select * from Student where name = ? and age = ?
//
//select * from Student 查询所有
//
//
//select name,imageData from Student where name = ? and age = ?
//select name,imageData 只查询这两个字段

- (LanOuStudent *)selecteStudentWithName:(NSString *)name age:(NSInteger)age{
//    打开数据库
   db = [self openDB];
//    写sql语句
    NSString *sql = @"select * from Student where name = ? and age = ?";
    //创建跟随指针
    sqlite3_stmt *stmt = nil;
    //创建一个对象
    Student *stu = [[Student alloc]init];
    //预执行
  int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    
    if (result == SQLITE_OK) {
        NSLog(@"成功");
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        sqlite3_bind_int(stmt, 2, (int)age);
        
        //执行语句
       // sqlite3_step(stmt);
        
        //查询时
        //如果下一行 准备好了 返回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 *sex = (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
            //把C语言字符串 转化成OC字符串
            stu.name = [NSString stringWithUTF8String:name];
            stu.age = age;
            stu.number = number;
            stu.sex = [NSString stringWithUTF8String:sex];
            stu.imageData = imageData;

        }
        
    } else {
        NSLog(@"失败");
        NSLog(@"%d",result);
    }

    //释放stmt
    sqlite3_finalize(stmt);
    //关闭数据库
    [self closeDB];
    return [stu autorelease];
   
}

//  查询所有(返回一个数组)
//  selecte *from student
- (NSArray *)selecteAllStudent{

//    打开数据库
   db = [self openDB];
//    写sql语句
    NSString *sql = @"selecte *from student";
//    创建一个可变数组备用
    NSMutableArray *array = [NSMutableArray array];
//    创建跟随指针
    sqlite3_stmt *stmt = nil;
//    预执行
   int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"成功");
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //读取数据
            int number = sqlite3_column_int(stmt, 0);
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *sex = (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)];
            Student *stu = [[Student alloc]init];
            //赋值model
            stu.name = [NSString stringWithUTF8String:name];
            stu.age = age;
            stu.number = number;
            stu.sex = [NSString stringWithUTF8String:sex];
            stu.imageData = imageData;

            //添加到数组
            [array addObject:stu];
        }
        
    } else {
        NSLog(@"失败");
    }
    
    //释放指针
    sqlite3_finalize(stmt);
    [self closeDB];
    return array ;

}


0 0