CYC-数据库的运用

创建数据库前 需要导入 #import


// 名字
@property (nonatomic, retain) NSString *name;
// 年龄
@property (nonatomic, assign) NSInteger age;
// 性别
@property (nonatomic, retain) NSString *gender;
// 学号
@property (nonatomic, assign) NSInteger number;

现在开始创建数据库 方法写在单例里面 方便后面全局使用

#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface SQLiteManager : NSObject
// 初始化方法
+(SQLiteManager *)shareManaher;
// 如果你要使用数据库的话 要引入一个框架
// libsqlite3.0.dylib 框架
// 使用的话 需要引入头文件 #import <sqlite3ext.h>
// 打开数据库
// sqlite3 * 表示咱们的数据库
- (sqlite3 *)openDB;
// 关闭数据库
- (void)closeDB;
// 创建一个表
- (void)createTable;
// 插入数据
- (void)insertWith:(Student *)student;
// 删除数据
- (void)deleteAge:(NSInteger) age;
// 修改数据
- (void)updateName:(NSString *)name byAge:(NSInteger)age;
// 查询数据
- (Student *)selectName:(NSString *)name byAge:(NSInteger)age;
// 查询全部数据
- (NSArray *)selectAll;
@end

具体实现

#import "SQLiteManager.h"
#import "Student.h"

@implementation SQLiteManager


// 初始化方法a

// 创建单例类 进行对数据库 操作方法的封装

+(SQLiteManager *)shareManaher
{
    static SQLiteManager *manager = nil;
    if (manager == nil) {
        manager = [[SQLiteManager alloc] init];
    }
    return manager;
}

#pragma mark - 实现方法


// 定义一个静态指针 负责连接数据库
// 保证数据库 直到程序结束  才会释放

static sqlite3 *db = nil;

// 打开数据库
- (sqlite3 *)openDB
{
    // 判断
    // 如果数据不为空的话 就说明数据库存在 直接返回就行
    if(db != nil) {
        return db;
    }
    // 不存在 就去创建
    // 获取路径
//    NSArray *documentsArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    NSString *documentsPath = documentsArr[0];
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    // 拼接路径
    // 数据库的名称
    NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];

    NSLog(@"%@", dbPath);
    // 创建数据库
    // 参数一 文件路径
    // 参数2 数据库地址
  //  sqlite3_open 该函数 如果有数据库 就打开 没有 就创建一个
    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) {

        // 如果成功的话 把数据库置为空
        db = nil;

        NSLog(@"关闭数据库成功");
    }else {
        NSLog(@"关闭数据库失败");
    }
}

// 创建一个表
- (void)createTable
{

    //   步骤
//        1. 打开数据库
    db = [self openDB];
//        2. 写创建表的sql语句
    NSString *sql = @"create table IF NOT EXISTS Student(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL)";
//        3. 执行sql语句
    // char **errmsg 错误信息
    char *error = nil;
    int result = sqlite3_exec(db, sql.UTF8String, nil, nil, &error);
//        4. 判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else {
        NSLog(@"创建表失败");
    }
//        5. 关闭数据库
    [self closeDB];
}


// 插入数据
// 插入的不是model 而是model的信息
- (void)insertWith:(Student *)student
{
    // 1.打开数据库
   db = [self openDB];
    // 2. 写sql语句
    NSString *sql = [NSString stringWithFormat:@"insert into Student(name, gender, age, number) values('%@', '%@', '%ld', '%ld')", student.name, student.gender, student.age, student.number];
    // 3. 执行语句
    int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
    // 4. 判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"插入表成功");
    }else {
        NSLog(@"插入表失败");
    }
    // 5. 关闭数据库
    [self closeDB];
}

// 删除数据
- (void)deleteAge:(NSInteger) age
{
    // 打开数据库
   db = [self openDB];
    // 写sql 语句
    NSString *sql = [NSString stringWithFormat:@"delete from Student where age > '%ld' ", age];
    // 执行语句
    int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
    // 判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    }else {
        NSLog(@"删除失败");
    }
    // 关闭数据库
    [self closeDB];
}


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

}


// 查询数据 根据名字 和 年龄 查询学生
- (Student *)selectName:(NSString *)name byAge:(NSInteger)age
{
    // 1. 打开数据库
   db = [self openDB];
    // 2.写sql语句
    NSString *sql = [NSString stringWithFormat:@"select * from Student where name = '%@' and age = '%ld'",name, age];
    // 3.创建跟随指针 保存sql语句
    sqlite3_stmt *stmt = nil;
    // 4.执行sql语句
    // int nbyte 表示sql语句的长度 -1 代表无限长
    // const char **pzTail 截取未执行的部分语句
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil);

    // 5.判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"查询数据成功");
        // 6.绑定查询条件信息
        // 查询的条件是啥类型的 就算sqlite3_bind_啥类型
        // 参数二 查询条件的顺序 从1开始
        // 参数三 填 查询条件的 字段名
        // 参数四 长度 -1
        // 参数五 绑定后执行的函数
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, nil);
        // 绑定条件二
        sqlite3_bind_int(stmt, 2, -1);
        // 7.开始查询
        // sqlite3_step(stmt) == SQLITE_ROW
        // 如果这条语句 可以被找到 就返回SQLITE_ROW
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            // 8. 获取数据
            // 参数二 <#int iCol#> 在数据库表中 列数从0开始 需要打开数据库看一下 在第几列

            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *) sqlite3_column_text(stmt, 2);
            int age = sqlite3_column_int(stmt, 3);
            int number = sqlite3_column_int(stmt, 0);
            // 9. 给对象进行赋值

            Student *student = [[Student alloc] init] ;
            // 把C语言的字符串 转回OC字符串
            student.name = [NSString stringWithUTF8String:name];
            student.gender = [NSString stringWithUTF8String:gender];
            student.age = age;
            student.number = number;
            // 10.释放跟随指针
            sqlite3_finalize(stmt);

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

            // 11. 返回数据
            return [student autorelease];
        }

    } else {

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

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

    return nil;
}

// 查询全部数据
- (NSArray *)selectAll
{
    // 1.打开数据库
    db = [self openDB];
    //2. 写sql语句
    NSString *sql = [NSString stringWithFormat:@"select * from Student"];
    // 3.创建跟随指针 保存sql语句
    sqlite3_stmt *stmt = nil;
    // 4.执行查询语句

    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil);
    // 5.判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"查询数据成功");
        // 6.不用绑定查询条件 创建一个数组 保存查询好的 model
        NSMutableArray *array = [NSMutableArray array];

        // 7.开始查询
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 8.读取数据

            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *) sqlite3_column_text(stmt, 2);
            int age = sqlite3_column_int(stmt, 3);
            int number = sqlite3_column_int(stmt, 0);

            // 9.创建 model 并赋值

            Student *model = [[Student alloc] init];
            model.name = [NSString stringWithUTF8String:name];
            model.gender = [NSString stringWithUTF8String:gender];
            model.age = age;
            model.number = number;

            // 10. 把model 装进数组中
            [array addObject:model];

            // 11. 释放model对象
            [model release];
        }
        //12. 释放跟随指针
        sqlite3_finalize(stmt);
        // 13. 关闭 数据库
        [self closeDB];

        // 14.返回数组
        return array;

    } else {
        NSLog(@"查询数据失败");
    }

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

     return  nil;

}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值