数据库操作 只是为我们提供两个功能 打开数据库和关闭数据库
对于应用程序来说,一个数据库足以
想要使用sqlite需要进行两部操作
1.导入动态链接库 libsqlite3.0.dalib
2.导入头文件 #import <sqlite3.h>
//打开数据库
+(sqlite3 *)openDataBase
{
//@synchronized 安全锁
if (sqlite) {
return sqlite;
}
//创建数据库
//获取documents 文件路径
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
NSLog(@"%@",documentsPath);
//文件拼接
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"DB.sqlite"];
//打开
//通过路径查询到文件 如果文件存在,打开 如果不存在 先进行创建,在打开
int result = sqlite3_open([dbPath UTF8String], &sqlite);
if (result == SQLITE_OK) {
NSLog(@"打开数据库成功");
//创建表单
//创建sql语句
NSString *sql = @"CREATE TABLE Student (stu_ID INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL,sex TEXT NOT NULL,age INTEGER NOT NULL DEFAULT 1000,score FLOAT NOT NULL)";
sqlite3_exec(sqlite, [sql UTF8String], NULL, NULL, NULL);
}
return sqlite;
}
//关闭数据库
+(void)closeDataBase
{
int result = sqlite3_close(sqlite);
if (result == SQLITE_OK) {
sqlite = nil;
}
}
//插入
- (IBAction)insertAction:(id)sender {
//1.打开数据库
sqlite3 *db = [DatabaseHandle openDataBase];
//2.创建指令集(伴随指针)
sqlite3_stmt *stmt = nil;
//3.创建sql语句
NSString *sql = @"INSERT INTO Student(name,sex,age,score)VALUES (?,?,?,?)";
//4.语法检查
//sqlite3 *db : 数据库指针
//const char *zSql : C语言的sql语句
//int nByte : 给定sql语句的长度,一般我们给-1,表示无穷大,不限制长度
//sqlite3_stmt **ppStmt : 伴随指针的地址,存放sql语句和数据库地址信息
//const char **pzTail : 预留参数
//语法检查的作用:不会执行sql语句,只是检查数据库是否正确打开,sql语句是否正确 如果正确,将数据库的信息和sql语句的信息,放入伴随指针中
int flag = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
//5.判断语法检查是否正确
if (flag == SQLITE_OK) {
//6.参数绑定
sqlite3_bind_text(stmt, 1, [_nameLabel.text UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [_sexLabel.text UTF8String], -1, nil);
sqlite3_bind_int(stmt, 3, [_ageLabel.text intValue]);
sqlite3_bind_double(stmt, 4, [_scoreLabel.text doubleValue]);
//7.执行
sqlite3_step(stmt);
//8.释放所有权
sqlite3_finalize(stmt);
//9.关闭数据库
[DatabaseHandle closeDataBase];
}
}
//查询
- (IBAction)selectAction:(id)sender {
//1.打开数据库
sqlite3 *sqlite = [DatabaseHandle openDataBase];
//2.创建指令集
sqlite3_stmt *stmt = nil;
//3.创建sql语句
NSString *sql = @"SELECT *FROM Student WHERE stu_ID = ?";
//4.语法检查
int flag = sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, nil);
//5.判断语法检查是否正确
if (flag == SQLITE_OK) {
//6.参数绑定
sqlite3_bind_int(stmt, 1, [_numberLabel.text intValue]);
//7.执行
//对于sqlite3_step()在查询时,可能会有多个符合条件的数据条 当查询完一条数据时,sqlite3_step()会往下看有没有下一条数据 如果有,返回SQLITE_ROW,如果没有,返回SQLITE_DONE
//所以,我们在进行查询时 以sqlite3_step()是否等于SQLITE_ROW作为循环获取数据的条件
while (sqlite3_step(stmt) == SQLITE_ROW) {
//获取数据
char *nameC = (char *)sqlite3_column_text(stmt, 1);
char *sexC = (char *)sqlite3_column_text(stmt, 2);
int ageC = sqlite3_column_int(stmt, 3);
double scoreC = sqlite3_column_double(stmt, 4);
//转化为OC中的类型
NSString *name = [NSString stringWithUTF8String:nameC];
NSString *sex = [NSString stringWithUTF8String:sexC];
NSString *age = [NSString stringWithFormat:@"%d",ageC];
NSString *score = [NSString stringWithFormat:@"%f",scoreC];
_nameLabel.text = name;
_sexLabel.text = sex;
_ageLabel.text = age;
_scoreLabel.text = score;
}
}
//8.释放所有权
sqlite3_finalize(stmt);
//9.关闭数据库
[DatabaseHandle closeDataBase];
}
//更新
- (IBAction)updateAction:(id)sender {
//1.打开数据库
sqlite3 *db = [DatabaseHandle openDataBase];
//2.创建指令集
sqlite3_stmt *stmt = nil;
//3.创建sql语句
NSString *sql = @"UPDATE Student SET sex = ? WHERE name = ?";
//4.语法检查
int flag = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
//5.判断语法检查是否正确
if (flag == SQLITE_OK) {
//6.绑定参数
sqlite3_bind_text(stmt, 1, [_sexLabel.text UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [_nameLabel.text UTF8String], -1, nil);
//7.执行
sqlite3_step(stmt);
}
//8.释放所有权
sqlite3_finalize(stmt);
//9.关闭数据库
[DatabaseHandle closeDataBase];
}
//删除
- (IBAction)deleteAction:(id)sender {
//1.打开数据库
sqlite3 *db = [DatabaseHandle openDataBase];
//2.创建指令集
sqlite3_stmt *stmt = nil;
//3.创建sql语句
NSString *sql = @"DELETE FROM Student WHERE name = ?";
//4.语法检查
int flag = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
//5.判断语法检查是否正确
if (flag == SQLITE_OK) {
//6.参数绑定
sqlite3_bind_text(stmt, 1, [_nameLabel.text UTF8String], -1, nil);
}
//7.执行
sqlite3_step(stmt);
//8.释放所有权
sqlite3_finalize(stmt);
//9.关闭数据库
[DatabaseHandle closeDataBase];
}