// 初始化方法
// 创建单例类 进行对数据库 操作方法的封装
+ (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];
//拼接路径
// 数据库的名称 Student.sqlite
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];
NSLog(@"%@", dbPath);
// 创建数据库
// 参数1,文件路径 需要把OC 的字符串 转化一下类型dbPath.UTF8String
// 参数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. 打开数据库
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. 执行这个语句
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 而是它的信息
- (void)insertModel:(Model *) model
{
// 打开数据库
db = [self openDB];
//创建sql语句
NSString *sql =[NSString stringWithFormat:@"insert into student (number, name, gender, age) values ( '%ld', '%@', '%@', %ld)", model.number, model.name, model.gender, model.age];
// 执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
if (result == SQLITE_OK) {
NSLog(@"插入成");
} else
{
NSLog(@"失败了");
}
}
// 删除
- (void)deleteModelWithAge:(NSInteger)age
{
// 1. 打开数据库
db = [self openDB];
// 2. 写sql语句
NSString *sql = [NSString stringWithFormat:@"delete from student where age > '%ld' ", age];
// 3.执行语句
int ruslt = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
// 4.判断是否成功
if (ruslt == SQLITE_OK) {
NSLog(@"删除成功");
} else
{
NSLog(@"删除失败");
}
// 关闭
[self closeDB];
}
// 更新
- (void)updateName:(NSString *)name setAge:(NSInteger)age
{
db = [self openDB];
NSString *sql = [NSString stringWithFormat:@"update student set age = '%ld' where name = '%@' ", age, name];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
if (result == SQLITE_OK) {
NSLog(@"更新成功");
} else
{
NSLog(@"更新失败");
}
}
// 查询 根据姓名和年龄查询 学生
- (Model *)queryStudentWithName:(NSString *)name andAge:(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;
// 执行语句
// 第三个参数 <#int nByte#> 表示SQL语句的长度
// 第四个参数 截取未执行的语句 一般都NULL
// 执行语句
int result = sqlite3_prepare(db, sql.UTF8String, -1, &stmt, NULL);
// 5,判定是否成
if (result == SQLITE_OK )
{
NSLog(@"查询语句成功");
// 6. 绑定查询信息
// 查询的条件是啥类型的 就选什么类型的 sqlite3_bind
// 参数2 指查询的第几个问号 从1开始(name)
// 参数3 填 查询条件的 字段名
// 参数4 长度-1
// 参数5 绑定后执行的函数 一般都是null
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
// 绑定条件2
// 参数2 指查询的第几个问号 从2开始(age)
sqlite3_bind_int(stmt, 2, -1);
// 7. 开始查询
// sqlite3_step(stmt) == SQLITE_ROW
// 如果 这条语句可以被找到 就返回SQLITE_ROW
while (sqlite3_step(stmt) == SQLITE_ROW)
{
// 8. 获取数据
// c参数2 <#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. 给对象进行 赋值
Model *model = [[Model alloc] init];
// c语言的字符串 转回 OC 字符串
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10. 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];
// 11. 返回数据 并释放对象
return [model autorelease];
}
} else
{
NSLog(@"查询语句执行失败");
}
// 关闭数据库
[self closeDB];
return nil;
}
// 查询所有的学生信息
- (NSArray *)queryAllModel
{
// 1.打开数据库
db = [self openDB];
// 2.sql 语句
NSString *sql = @"select *from student";
//3.创建跟随指针
sqlite3_stmt *stmt = nil;
// 4.执行SQL语句
int result = sqlite3_prepare(db, sql.UTF8String , -1, &stmt, NULL);
// 5.判断是否成功
if (result == SQLITE_OK)
{
NSLog(@"all 查询成功");
// 6. 不用绑定查询 创建一个数组(mutable) 保存查询好的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 *model = [[Model alloc]init];
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10. 把model 放到数据中
[array addObject:model];
[model release];
}
// 11. s释放跟随指针
sqlite3_finalize(stmt);
// 12.关闭数据库
[self closeDB];
// 13. 返回数组
return array;
} else
{
NSLog(@"all 查询失败");
}
// 14. 关闭数据库
[self closeDB];
return nil;
}
// 创建单例类 进行对数据库 操作方法的封装
+ (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];
//拼接路径
// 数据库的名称 Student.sqlite
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];
NSLog(@"%@", dbPath);
// 创建数据库
// 参数1,文件路径 需要把OC 的字符串 转化一下类型dbPath.UTF8String
// 参数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. 打开数据库
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. 执行这个语句
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 而是它的信息
- (void)insertModel:(Model *) model
{
// 打开数据库
db = [self openDB];
//创建sql语句
NSString *sql =[NSString stringWithFormat:@"insert into student (number, name, gender, age) values ( '%ld', '%@', '%@', %ld)", model.number, model.name, model.gender, model.age];
// 执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
if (result == SQLITE_OK) {
NSLog(@"插入成");
} else
{
NSLog(@"失败了");
}
}
// 删除
- (void)deleteModelWithAge:(NSInteger)age
{
// 1. 打开数据库
db = [self openDB];
// 2. 写sql语句
NSString *sql = [NSString stringWithFormat:@"delete from student where age > '%ld' ", age];
// 3.执行语句
int ruslt = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
// 4.判断是否成功
if (ruslt == SQLITE_OK) {
NSLog(@"删除成功");
} else
{
NSLog(@"删除失败");
}
// 关闭
[self closeDB];
}
// 更新
- (void)updateName:(NSString *)name setAge:(NSInteger)age
{
db = [self openDB];
NSString *sql = [NSString stringWithFormat:@"update student set age = '%ld' where name = '%@' ", age, name];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
if (result == SQLITE_OK) {
NSLog(@"更新成功");
} else
{
NSLog(@"更新失败");
}
}
// 查询 根据姓名和年龄查询 学生
- (Model *)queryStudentWithName:(NSString *)name andAge:(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;
// 执行语句
// 第三个参数 <#int nByte#> 表示SQL语句的长度
// 第四个参数 截取未执行的语句 一般都NULL
// 执行语句
int result = sqlite3_prepare(db, sql.UTF8String, -1, &stmt, NULL);
// 5,判定是否成
if (result == SQLITE_OK )
{
NSLog(@"查询语句成功");
// 6. 绑定查询信息
// 查询的条件是啥类型的 就选什么类型的 sqlite3_bind
// 参数2 指查询的第几个问号 从1开始(name)
// 参数3 填 查询条件的 字段名
// 参数4 长度-1
// 参数5 绑定后执行的函数 一般都是null
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
// 绑定条件2
// 参数2 指查询的第几个问号 从2开始(age)
sqlite3_bind_int(stmt, 2, -1);
// 7. 开始查询
// sqlite3_step(stmt) == SQLITE_ROW
// 如果 这条语句可以被找到 就返回SQLITE_ROW
while (sqlite3_step(stmt) == SQLITE_ROW)
{
// 8. 获取数据
// c参数2 <#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. 给对象进行 赋值
Model *model = [[Model alloc] init];
// c语言的字符串 转回 OC 字符串
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10. 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];
// 11. 返回数据 并释放对象
return [model autorelease];
}
} else
{
NSLog(@"查询语句执行失败");
}
// 关闭数据库
[self closeDB];
return nil;
}
// 查询所有的学生信息
- (NSArray *)queryAllModel
{
// 1.打开数据库
db = [self openDB];
// 2.sql 语句
NSString *sql = @"select *from student";
//3.创建跟随指针
sqlite3_stmt *stmt = nil;
// 4.执行SQL语句
int result = sqlite3_prepare(db, sql.UTF8String , -1, &stmt, NULL);
// 5.判断是否成功
if (result == SQLITE_OK)
{
NSLog(@"all 查询成功");
// 6. 不用绑定查询 创建一个数组(mutable) 保存查询好的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 *model = [[Model alloc]init];
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10. 把model 放到数据中
[array addObject:model];
[model release];
}
// 11. s释放跟随指针
sqlite3_finalize(stmt);
// 12.关闭数据库
[self closeDB];
// 13. 返回数组
return array;
} else
{
NSLog(@"all 查询失败");
}
// 14. 关闭数据库
[self closeDB];
return nil;
}