云海飞翔lee-数据库

SQlite常用语句    注:SQlite语句 不区分大小写

       创建表的语句

        creat table  if not exists Classmates (number integer primary key not NULL, name text not  NULL, gender text not NULL, age integer not NULL)


        插入语句

        insert into Classmates (name, gender, age, number) values (name = '%@', gender = '%@', age = '%ld', number = '%ld')


        删除语句
        delete from Classmates where age > '%ld'
     
        更新语句
        update Classmates set age = '%ld' where name = '%@'
        
        查询语句
        select * from Classmates where name = '%@' and age = '%ld'

    

通常一个app只需要一个创建一个数据库, 所以我们把它写成一个单例类

声明的一些方法

<span style="font-size:18px;">// 初始化方法
+ (SQLiteManager *)shareManager;

// 如果要使用数据库,需要引入一个框架: libsqlite3.0.dylib, 再导入头文件
// 打开数据库
- (sqlite3 *)openDB;   // sqlite3 * 表示数据库

// 关闭数据库
- (void)closeDB;

//创建一个表
- (void)create;

// 插入数据
- (void)insert:(Classmate *)mate;

// 删除数据
- (void)deleteClassmateWithAge:(NSInteger)age;

// 更新数据
- (void)updateClassmateName:(NSString *)name byNumber:(NSInteger)number;

// 查询数据
- (Classmate *)selectModelByName:(NSString *)name age:(NSInteger)age;

// 查询符合条件的所有数据
- (NSArray *)selectAllModelByGender:(NSString *)gender age:(NSInteger)age;

</span>
实现部分

+ (SQLiteManager *)shareManager
{
    // 创建单例类 进行对数据库 操作方法的封装
    static SQLiteManager *manager = nil;
    if (manager == nil) {
        manager = [[SQLiteManager alloc] init];
    }
    return manager;
}

// 定义一个静态指针, 负责连接数据库 (sqlite3 *)类型
static sqlite3 *db = nil; // 保证数据库直到结束才被释放

// 打开数据库
- (sqlite3 *)openDB
{
    if (db != nil) {
        return db;
    }
    // 创建需要获取到路径
    // NSArray *documentPathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 拼接路径
    NSString *path = [NSString stringWithFormat:@"%@/classmate.sqlite", kDocumentPath];
    NSLog(@"%@", path);
    // 创建 数据库
    // 参数:const char *filename 数据库的路径(需要把oc字符串转化一下类型), sqlite3 **ppDb 地址
    // sqlite3_open 该函数如果有数据库就打开, 没有就创建一个
    int result = sqlite3_open(path.UTF8String, &db);
    // 查看命令返回结果
    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)create
{
    /**
     *  步骤:1.打开数据库  2.创建table(写sqlite语句)  3.执行sql语句  4.判断返回值 是否成功  5.关闭数据库
     */
    
    [self openDB];
   NSString *str = @"create table IF NOT EXISTS classmates(number integer primary key not NULL, name text not NULL, gender text 
not NULL, age integer not NULL)";
    // 执行sql语句
    /*
     * sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **), void *, char **errmsg)
     第1个参数  是前面open函数得到的指针。
     第2个参数  是一条sql语句。
     第3个参数  是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
     第4个参数  是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
等下我们再看回调函数的写法,以及这个参数的使用。
     第5个参数  是错误信息
     */
    int result = sqlite3_exec(db, str.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"创建table成功");
    } else {
        NSLog(@"创建table失败");
    }
    
    // 关闭数据库
    [self closeDB];
    
}

// 插入数据
- (void)insert:(Classmate *)mate
{
    // 插入的不是model, 而是model的信息
    [self openDB];
    NSString *str = [NSString stringWithFormat: @"insert into classmates(name, gender, age, number) values('%@', '%@', '%ld', 
  '%ld')", mate.name, mate.gender, mate.age, mate.number];
    int result = sqlite3_exec(db, str.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"插入成功");
    } else {
        NSLog(@"插入失败");
    }
    [self closeDB];
    
}

// 删除数据
- (void)deleteClassmateWithAge:(NSInteger)age
{
    [self openDB];
    NSString *str = [NSString stringWithFormat:@"delete from classmates where age > '%ld'", age];
    int result = sqlite3_exec(db, str.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
    [self closeDB];
}

// 更新数据
- (void)updateClassmateName:(NSString *)name byNumber:(NSInteger)number
{
    [self openDB];
    NSString *str = [NSString stringWithFormat:@"update classmates set name = '%@' where number = '%ld'", name, number];
    int result = sqlite3_exec(db, str.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"更新成功");
    } else {
        NSLog(@"更新失败");
    }
    [self closeDB];
}

// 查询数据
- (Classmate *)selectModelByName:(NSString *)name age:(NSInteger)age
{
    [self openDB];
    NSString *str = [NSString stringWithFormat:@"select * from classmates where name = '%@' and age = '%ld'", name, age];
    // 创建跟随指针, 保存sql 语句
    sqlite3_stmt *stmt = nil;
    // 执行语句
    // sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>,
 <#const char **pzTail#>)
    // int nByte表示 sql 语句的长度, 一般写 -1 无限长
    // const char **pzTail  截取未执行的语句
    int result = sqlite3_prepare_v2(db, str.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"执行语句成功");
        // 绑定查询条件信息 sqlite3_bind_  查询条件是什么类型的 _后面就选哪个类型的方法
        // sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int n#>, <#void (*)(void *)#>)
        // 参数1:stmt 参数二:int 查询条件的顺序 从1开始  参数三 查询条件的字段名  参数四:sql语句长度  参数五:绑定后执行的函数.
        // 绑定条件1
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        // 绑定条件2
        sqlite3_bind_int(stmt, 2, -1);
        
        // 开始查询  sqlite3_step(stmt) == SQLITE_ROW  如果这条sql语句可以被找到,就返回 SQLITE_ROW
        while (sqlite3_step(stmt) == SQLITE_ROW) {
           // 获取数据 参数:<#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);
            
            // 给model赋值
            Classmate *mate = [[[Classmate alloc] init] autorelease];
            mate.name = [NSString stringWithUTF8String:name];
            mate.gender = [NSString stringWithUTF8String:gender];
            mate.number = number;
            mate.age = age;
            
            // 释放跟随指针 关闭数据库
            sqlite3_finalize(stmt);
            [self closeDB];
            return mate;
        }
    
        
    } else {
        NSLog(@"执行语句失败");
    }
    
    [self closeDB];
    
    return nil;
}


// 查询符合条件的所有数据
- (NSArray *)selectAllModelByGender:(NSString *)gender age:(NSInteger)age
{
    [self openDB];
    NSString *str = [NSString stringWithFormat:@"select * from classmates where gender = '%@' and age > '%ld'", gender, age];
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, str.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"执行语句成功");
        // 如果没有条件(查询所有数据)
        sqlite3_bind_text(stmt, 1, gender.UTF8String, -1, NULL);
        sqlite3_bind_int(stmt, 2, -1);
        
        // 开始查询
        NSMutableArray *modelArray = [NSMutableArray array];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 读取数据
            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);
            
            Classmate *mate = [[Classmate alloc] init];
            mate.name = [NSString stringWithUTF8String:name];
            mate.gender = [NSString stringWithUTF8String:gender];
            mate.age = age;
            mate.number = number;
            [modelArray addObject:mate];
            [mate release];
            
        }
        sqlite3_finalize(stmt);
        [self closeDB];
        return modelArray;
        
    } else {
        NSLog(@"执行失败");
        [self closeDB];
        return nil;
    }
}

 // 创建一个操作数据库的对象, 并且打开数据库
    SQLiteManager *manager = [SQLiteManager shareManager];
//    [manager openDB];
//    [manager closeDB];
//    [manager create];
//    Classmate *mate = [[Classmate alloc] init];
//    mate.name = @"欧阳锋";
//    mate.gender = @"男";
//    mate.age = 19;
//    mate.number = 5;
//    [manager insert:mate];
//    [mate release];
//    
//    [manager deleteClassmateWithAge:19];
//    [manager updateClassmateName:@"黄药师" byNumber:4];
//    
//    Classmate *mate1 = [manager selectModelByName:@"洪七" age:18];
    NSArray *arr = [manager selectAllModelByGender:@"男" age:17];
    NSLog(@"%ld", arr.count);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值