当前类中导入头文件
// 1、打开数据库
// 创建数据库文件所在路径字符串
NSString *path = @"/Users/Boris/Public/蓝懿第三期/Day31 - SQLite/test.db";
// 创建数据库指针, 先赋值为空, 稍后他会被赋值.
// 以防万一出现野指针, C语言的空是 NULL, ObjC的空是 nil
sqlite3 *db = NULL;
// 打开数据库, 并且把已经打开的数据库赋值给 db 这个指针.
// 第一个参数是数据库文件位置, 第二个参数是一个指针, 一个指向指针类型变量的指针
// 之所以用这种 指针的指针 的方式来创建对象, 是因为该函数返回值有其它作用, 不能用来返回数据库变量. 但又有需求要这个函数"返回"多个值(执行状态、数据库变量实例), 所以只能通过传统返回值方式返回一个结果(执行状态), 再通过参数间接的"返回"另外一个结果(数据库变量实例).
int res_open = sqlite3_open(path.UTF8String, &db);
if (res_open == SQLITE_OK) {
// NSLog(@"成功打开数据库");
// 1、创建表
[self executeSQLite:db withSQL:@"create table if not exists t_newtable (id integer primary key autoincrement ,name text, age integer, math real)"];
// 2、插入数据
[self executeSQLite:db withSQL:@"insert into t_newtable (name, age, math) values ('Tom', 10, 100)"];
// 3、查询数据
[self quaryData:db];
} else {
NSLog(@"打开数据库失败, 失败代码: %d", res_open);
}
}
- (void)executeSQLite:(sqlite3 *)db withSQL:(NSString *)sql {
// 新创建一个C语言的字符串变量指针, 准备稍后接收错误信息用.
char *errMsg = NULL;
/**
* 通过调用 sqlite3_exec() 函数来执行特定的 SQL 语句
* 第一个参数是: 给哪个数据库执行? 传一个数据库变量进去
* 第二个参数是: 执行什么? 传进去一个 SQL 语句的C语言字符串
* 第三个、第四个是回调, 用不上直接赋值"空" NULL (注意C语言与ObjC语言的"空"不一样, NULL、nil)
* 第五个参数是: 如果产生错误信息, 把错误信息保存到哪里去? 传入一个字符串指针.
* 返回值: 是一个整数, 表示当前函数执行结果, 例如执行成功或执行失败.
*/
int res_exec = sqlite3_exec(db, sql.UTF8String, NULL, NULL, &errMsg);
// 通过判断 sqlite3_exec() 的返回值来确认当前 SQL 语句是否执行成功
res_exec == SQLITE_OK ? /* NSLog(@"SQL 语句执行成功!") */ : NSLog(@"SQL 执行失败, 原因: %s", errMsg);
}