// 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
iOS激情详解之SQL增删改查
最新推荐文章于 2021-02-21 12:23:15 发布