//导入框架
//创建一个学生对象NSObject,在.h中写入
@interface Student : NSObject
@property (nonatomic, retain)NSString *name;
@property (nonatomic, retain)NSString *sex;
@property (nonatomic, assign)NSInteger number;
@end
- (void)dealloc
{
[_name release];
[_sex release];
[super dealloc];
}
//创建一个数据库名字DataBaseHandler的NSObject,在.h文件中写入下面声明方法
#import <Foundation/Foundation.h>
#import <sqlite3.h>
//引入学生头文件
#import "Student.h"
//在数据库的.h文件中写下面代码
@interface DataBaseHandler : NSObject
{
//数据库指针, 指向本地的数据库文件
sqlite3 *dbPoint;
}
//创建数据库的单例的创建方法
//单例的创建方法
//1.类方法
+ (DataBaseHandler *)shareInstance;
//打开数据库
- (BOOL)openDB;
//关闭数据库
- (BOOL)closeDB;
//创建表
- (BOOL)createTable;
//添加一条学生数据
- (BOOL)insertStudent:(Student *)stu;
//查询所有学生
- (NSMutableArray *)selectAll;
//修改(名字)
- (BOOL)updateStudent:(Student *)stu withName:(NSString *)newName;
//删除
- (BOOL)deleteStudentWithNumber:(int)number;
//在数据库的.m文件中写入以下内容
#import "DataBaseHandler.h"
@implementation DataBaseHandler
//数据库单例实现
+ (DataBaseHandler *)shareInstance
{
//当第一次执行的时候会产生一个空指针
static DataBaseHandler *handler = nil;
//对指针进行判断, 当第一次执行的时候创建一个对象
if (handler == nil) {
handler = [[DataBaseHandler alloc] init];
}
//无论是创建的和已经存在的, 都在这里直接return出去
return handler;
}
//打开数据库
-(BOOL)openDB
{
//1.拼接一个数据库文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//在documents文件夹下拼接一个数据库文件地址
NSString *dbPath = [docPath stringByAppendingPathComponent:@"suibian.db"];
//参数1:数据库文件存储的路径(UTF8String可以直接将oc语言字符串转成c语言字符串)
//参数2:数据库dbPoint指针地址
//返回值:执行sqlite函数的结果(int类型)
int result = sqlite3_open([dbPath UTF8String], &dbPoint);
if (result == SQLITE_OK ) {
NSLog(@"打开成功");
return YES;
}else {
NSLog(@"打开失败");
return NO;
}
}
//关闭数据库
-(BOOL)closeDB
{
int result = sqlite3_close(dbPoint);
//利用封装的方法判断结果
return [self judgeResult:result text:@"关闭"];
}
//判断结果的方法
- (BOOL)judgeResult:(int)result text:(NSString *)text
{
if (result == SQLITE_OK) {
NSLog(@"%@成功", text);
return YES;
}
else{
NSLog(@"%@失败", text);
NSLog(@"错误编码: %d", result);
return NO;
}
}
//创建表的方法实现
- (BOOL)createTable
{
NSString *sql = @"create table student(name text, number int primary key, sex text)";
//执行sql语句的函数
//参数1:数据库指针
//参数2:sql语句
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"创建表"];
}
//添加一条学生数据方法实现
- (BOOL)insertStudent:(Student *)stu
{
//拼接sql语句的时候注意:字符串要以单引号(')标记, 其他的都不标记
NSString *sql = [NSString stringWithFormat:@"insert into student values('%@', %ld, '%@')", stu.name, stu.number, stu.sex];
//执行sql语句, 判断结果
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"添加数据"];
}
//查询所有学生方法实现
- (NSMutableArray *)selectAll
{
//1.创建一个数据库的替身, 存储对数据库的所有操作
sqlite3_stmt *stmt = nil;
//2.准备sql语句并执行, 将结果保存在stmt中
NSString *sql = @"select * from student";
//参数1:数据库指针
//参数2:sql语句
//参数3:限制sql语句的长度(如果是-1的话, 就是不限制)
//参数4:替身指针的地址
//作用:让数据库执行sql语句, 并把结果保存到stmt中
int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
//3.创建一个可变数组, 用于存储数据
NSMutableArray *stuArr = [NSMutableArray array];
//4.去遍历所有的数据, 创建相应的学生对象
if (result == SQLITE_OK) {
//当sql执行成功, 遍历数据
//循环遍历所有的结果, 每次遍历到一条数据, 都会返回SQLITE_ROW, 如果没有数据了, 就不会返回SQLITE_ROW, 跳出循环
while (sqlite3_step(stmt) == SQLITE_ROW) {
//在循环体中去按例取数据
//text类型的数据取法
//参数1:替身
//参数2:第几列
const unsigned char *nameChar = sqlite3_column_text(stmt, 0);
//将char *字符串类型转为NSString字符串
NSString *name = [NSString stringWithUTF8String:(const char *)nameChar];
//取int类型的数据
int number = sqlite3_column_int(stmt, 1);
//取text类型的数据
const unsigned char *sexChar = sqlite3_column_text(stmt, 2);
//将char *字符串类型转为NSString字符串
NSString *sex = [NSString stringWithUTF8String:(const char *)sexChar];
Student *stu = [[Student alloc] init];
//拿获取到得数据 给学生对象赋值
stu.name = name;
stu.number = number;
stu.sex = sex;
//将学生对象添加到数组中
[stuArr addObject:stu];
[stu release];
}
}
//销毁stmt替身, 把里面的操作和结果写入本地sqlite文件
sqlite3_finalize(stmt);
return stuArr;
}
//删除数据,根据主键删除
- (BOOL)deleteStudentWithNumber:(int)number
{
NSString *sql = [NSString stringWithFormat:@"delete from student where number = '%d'", number];
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"删除数据"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//单例的使用
DataBaseHandler *dataHandler = [DataBaseHandler shareInstance];
//打开数据库(调用)
[dataHandler openDB];
//创建表成功
[dataHandler createTable];
//添加数据
Student *stu1 = [[Student alloc] init];
stu1.name = @"aaa";
stu1.number = 1;
stu1.sex = @"man";
[dataHandler insertStudent:stu1];
//查询所有数据
NSMutableArray *arr = [dataHandler selectAll];
NSLog(@"%@", arr);
//删除
[dataHandler deleteStudentWithNumber:1];
//关闭数据库
[dataHandler closeDB];
}