iOS激情详解之SQL增删改查

13 篇文章 0 订阅
// SQliteManager.h

// MySQlite

//

// Created by WDX  on 15/9/16.

// Copyright (c) 2015年 WDongXu. All rights reserved.

#import <Foundation/Foundation.h>

#import <sqlite3.h>

#import "Student.h"

@interface SQliteManager : NSObject

// 1,单例类初始化

+ (SQliteManager *)shareManager;

// 如果你要使用数据库的话 要引入一个框架

// libsqlite3.0.dylib 框架

// 使用的话需要引入头文件 #import <sqlite3.h>

// 2,打开数据库 有就打开没有就关闭

// sqlite3 *表示咱们的数据库

- (sqlite3 *)openDB;

// 3,关闭数据库

- (void)closeDB;

// 4,创建一个表

- (void)createTable;

// 5,插入数据 存的是model里面的信息 (增)

- (void)insertWith:(LanOuStudent *)student;

// 6,删除数据 删除19岁以上的 (删)

- (void)deleteStudentWithAge:(NSInteger)age;

// 7,更新数据 根据名字修改年龄 (改)

- (void)upDateName:(NSString *)name setAge:(NSInteger)age;

// 8,查询数据 根据名字和年龄查询学生 (查)

- (LanOuStudent *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age;

// 9,查询所有学生信息

- (NSArray *)queryAllStudents;

@end

//  SQliteManager.m
//  MySQlite
//
//  Created by WDX on 15/9/16.
//  Copyright (c) 2015年 WDongXu. All rights reserved.

#import "SQliteManager.h"

@implementation SQliteManager

//一, 初始化方法
// 创建单例类 进行对数据库 操作方法的封装
+ (SQliteManager *)shareManager

{
    static SQliteManager *manager = nil;
    if (manager == nil) {
        manager = [[SQliteManager alloc] init];

    }
    return manager;
}

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

// 二,实现
// *****打开数据库*****有就打开,没有就创建
// sqlite3 *表示咱们的数据库
- (sqlite3 *)openDB
{
    // 判断:如果数据库不为空 说明数据库存在 直接返回
    if (db != nil) {
        return db;
    }
    // 不存在 就创建一个数据库
    // 获取文件路径
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
  // 拼接路径
    NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];

    NSLog(@"%@", dbPath);
    // 创建数据库
    //const char *filename 参数1:文件路径 UTF8String:需要把OC字符串转换一下类型
    //sqlite3 **ppDb       参数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) {
        NSLog(@"关闭数据库成功");
        // 如果成功 把数据库重置为空
        db = nil;
    } else {
        NSLog(@"关闭数据库失败");
    }

}

// 四,创建一个表
- (void)createTable
{
    // 步骤:1,打开数据库
    //     2,写创建表的sql语句
    //     3,执行这条语句
    //     4,判断是否成功(返回值)
    //     5,关闭数据库

    // 打开数据库
    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)";
    // 2,执行这条语句
    //<#char **errmsg#> 错误信息
    // 3,可以定义一个错误信息
    char *error = nil;
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, &error);
    // 4,判断是否成功(返回值)
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    } else {
        NSLog(@"创建表失败");
    }
    // 5,关闭数据库
    [self closeDB];
}

// 五,插入数据 插入的不是model, 是model里面的信息   (增)
- (void)insertWith:(LanOuStudent *)student
{
    // 步骤:1,打开数据库
    //      2,写sql语句
    //      3,执行这条语句
    //      4,判断是否成功
    //      5,关闭数据库

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

}

// 六,删除数据 删除19岁以上的                       (删)
- (void)deleteStudentWithAge:(NSInteger)age
{
    // 步骤1,打开数据库
    // 2,写sql语句
    // 3,执行sql语句
    // 4,怕段是否成功
    // 5,关闭数据库

    // 1,打开数据库
    db = [self openDB];
    // 2,写sql语句
    NSString *sql = [NSString stringWithFormat:@"delete from lanOuStudent where age > '%ld'",age];
    // 3,执行sql语句
    int result = sqlite3_exec(db , sql.UTF8String, NULL, NULL, NULL);
    // 4,判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
    // 5,关闭数据库
    [self closeDB];
}
// 七,更新数据    根据名字修改年龄                    (改)
- (void)upDateName:(NSString *)name setAge:(NSInteger)age
{
    // 步骤1,打开数据库
    // 2,写sql语句
    // 3,执行sql语句
    // 4,怕段是否成功
    // 5,关闭数据库
    db = [self openDB];
    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 *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age
{
    // 步骤1,打开数据库
    // 2,写sql语句
    // 3,创建跟随指针 保存sql语句
    // 4,执行sql语句
    // 5,判断是否成功
    // 6,绑定查询条件信息
    // 7,开始查询
    // 8,获取数据
    // 9,给model对象赋值
    // 10,释放跟随指针(在这关闭数据库)
    // 11, 返回数据
    // 12, 关闭数据库

    // 1,打开数据库
    db = [self openDB];
    // 2,写sql语句
    NSString *sql = [NSString stringWithFormat:@"select * from lanOuStudent where name = '%@' and age = '%ld'",name,age];
    // 3,创建跟随指针 保存sql语句
    sqlite3_stmt *stmt = nil;
    // 4,执行sql语句 <#int nByte#>:表示sql语句的长度 -1代表无限长
    //  <#sqlite3_stmt **ppStmt#>:截取未执行的语句
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);

    // 5,判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"查询语句执行成功");

    // 6,绑定查询条件信息
        // 查询的条件是神马类型的就选bind_啥类型
        // <#void (*)(void *)#>参数二:查询条件的顺序 从1开始
        // <#const char *#>参数三:填查询条件的字段名
        // <#int n#> 参数4:长度-1
        // 参数五 绑定后执行的函数
        // 绑定条件1
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        // 绑定条件2
        sqlite3_bind_int(stmt, 2, -1); // 2是查询顺序

    // 7,开始查询
        // sqlite3_step(stmt) == SQLITE_ROW :如果这条语句:sqlite3_step(stmt)可以被查到就返回: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);
            char age = sqlite3_column_int(stmt, 3);
            char number = sqlite3_column_int(stmt, 0);
    // 9,给model对象赋值
            LanOuStudent *student = [[LanOuStudent 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(@"查询语句执行失败");
    }
    //12, 关闭数据库
    [self closeDB];
    return nil;
}

// 九,查询所有学生信息
- (NSArray *)queryAllStudents
{
    // 1,打开数据库
    // 2,写sql语句
    // 3,创建一个跟随指针 保存sql语句
    // 4,执行查询语句
    // 5,判断是否成功
    // 6,不用绑定查询 (因为查询所有) 并创建一个数组 保存查询好的model
    // 7,开始查询
    // 8,获取数据
    // 9,创建model,给model赋值
    // 10,把model 装进数组中
    // 11, 释放学生对象
    // 12,释放跟随指针
    // 13,关闭数据库
    // 14,返回数据
    // 15,再次关闭数据库

    // 1,打开数据库
    db = [self openDB];
    // 2,写sql语句
    NSString *sql = [NSString stringWithFormat:@"select * from lanOuStudent"];
    // 3,创建一个跟随指针 保存sql语句
    sqlite3_stmt *stmt = nil;
    // 4,执行查询语句
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    // 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);
            char age = sqlite3_column_int(stmt, 3);
            char number = sqlite3_column_int(stmt, 0);
    // 9,创建model,给model赋值
            LanOuStudent *students = [[LanOuStudent alloc] init];
            students.name = [NSString stringWithUTF8String:name];
            students.gender = [NSString stringWithUTF8String:gender];
            students.age = age;
            students.number = number;
    // 10,把model 装进数组中
            [array addObject:students];
    // 11, 释放学生对象
            [students release];
        }
    // 12,释放跟随指针
        sqlite3_finalize(stmt);
    // 13,关闭数据库
        [self closeDB];
    // 14,返回数据
        return array;
    } else {
        NSLog(@"查询执行失败");
    }

    // 15,再次关闭数据库
    [self closeDB];
    return nil;
}

@end

//  Student.h
//  MySQlite
//  Created by WDX on 15/9/16.
//  Copyright (c) 2015年 WDongXu. All rights reserved.

#import <Foundation/Foundation.h>

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

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值