数据库

创建一个单例类 使用sql语句来管理一个数据库(实现数据库的各种方法)

单例的类初始化方法 保证只有一个单例对象

+ (SQLiteManager *)shareManager;
{
    static SQLiteManager *handle = nil;

    if (handle == nil) {

        handle = [[SQLiteManager alloc] init];

        // 调用创建表的方法
        [handle createTable];
    }
    return handle;
}

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

static sqlite3 *db = nil;

打开数据库:

- (sqlite3 *)openDB
{
    // 判断数据库是否存在 如果存在的话 直接返回
    if (db != nil) {

        return db;

    }else{

        // 不存在 则创建一个并打开
        NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

        // 拼接数据库文件路径(拼接的数据库文件的名字)
        NSString *dbPath = [document 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 *stmt = nil;

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

    if (result == SQLITE_OK) {

        // 绑定问号(根据sql语句 来决定绑定的顺序)
        // 注意: 绑定的顺序 从1开始
        // 参数2 绑定的顺序
        // 参数3 要插入的值
        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);

        // [student.imageData bytes] 相当于获取到data数据的内容
        // (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];
}

/*

 如果有data数据进行插入的话
 sqlite3_exec 这个函数 会把data数据转化成字符串存入数据库
 如果你插入的数据没有data 数据的话 直接用函数 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];

}

*/

删除数据(根据一个条件删除):

- (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 = nil;

    // 预执行语句
    int result = sqlite3_prepare_v2(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 accordingName:(NSString *)name
{
    // 打开数据库
    [self openDB];

    // 写sql语句
    NSString *sql = [NSString stringWithFormat:@"update lanOuStudent 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];  
}

根据条件查询数据:

- (LanOuStudent *)selectStudentAccordingName:(NSString *)name age:(NSInteger)age
{
    // 打开数据库
    db = [self openDB];

    // 写sql语句
    NSString *sql = @"select * from lanOuStudent where name = ? and age = ?";

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

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

    // 预执行
    int result = sqlite3_prepare_v2(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
        // 这时可以继续查询
        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
            // [NSString stringWithUTF8String:name]
            // 把C语言字符串 转换成 OC字符串
            student.name = [NSString stringWithUTF8String:name];

            student.gender = [NSString stringWithUTF8String:gender];

            student.number = number;

            student.age = age;

            student.imageData = imageData;

        }

        NSLog(@"查询成功");

    }else{

        NSLog(@"查询失败");
    }

    // 释放跟随指针
    sqlite3_finalize(stmt);

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

    // 自动释放
    return [student autorelease];

}

查询所有(返回一个数组):

- (NSArray *)selectAllStudent
{

    // 打开数据库
    db = [self openDB];

    // 写sql语句
    NSString *sql = @"select * from lanOuStudent";

    // 创建一个可变数组备用
    NSMutableArray *array = [NSMutableArray array];

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

    // 预执行
    int result = sqlite3_prepare(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 *stu = [[LanOuStudent alloc] init];
            stu.number = number;
            stu.name = [NSString stringWithUTF8String:name];
            stu.gender = [NSString stringWithUTF8String:gender];
            stu.age = age;
            stu.imageData = imageData;

            // 添加到数组
            [array addObject:stu];

            [stu release];

        }

        NSLog(@"成功");

    }else{

        NSLog(@"失败");
    }

    // 释放跟随指针
    sqlite3_finalize(stmt);

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

    return array;

}

你可能感兴趣的:(UI)