一、创建数据库和表:
//1.获取沙盒中的数据库文件名,例如yyh.db
NSString *dbName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"yyh.db"];
//3.创建(打开)数据库,不存在时会自动创建数据库
int dbResult = sqlite3_open(dbName.UTF8String, &_db);
if(dbResult == SQLITE_OK){//打开成功
NSLog(@"打开数据库成功");
//4.创建表
//sql语句
const char *sql = "create table if not exists user (id integer primary key autoincrement, name text)";
//保存失败信息
char * errMsg = NULL;
//sqlite3_exec表示执行sql语句,创建表、增删改查都用这个方法
int tableResult = sqlite3_exec(_db, sql, NULL, NULL, &errMsg);
if(tableResult == SQLITE_OK){//创建表成功
NSLog(@"创建用户表成功");
} else {//创建表失败
NSLog(@"创建用户表失败");
}
} else {//打开失败
NSLog(@"打开数据库失败");
}
二、增删改查:
/*
增加
*/
- (void) insert{
//sql语句
NSString *name = @"姓名1";
NSString *sql = [NSString stringWithFormat:@"insert into user (name) values('%@')", name];
//保存失败信息
char * errMsg = NULL;
//sqlite3_exec表示执行sql语句,创建表、增删改都用这个方法
int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errMsg);
if(result == SQLITE_OK){//创建表成功
NSLog(@"添加成功");
} else {//创建表失败
NSLog(@"添加失败");
}
}
/*
更新,和增加一样,只是sql改下
*/
- (void) update{
}
/*
删除,和增加一样,只是sql改下
*/
- (void) delete{
}
/*
查询,要使用sqlite3_prepare_v2和sqlite3_step
*/
- (void) query{
//1.sql语句,?有多个时以,分隔
const char *sql = "select id, name from user where name = ?;";
//2.定义查询结果存放集
sqlite3_stmt * stmt = NULL;
//3.sqlite3_prepare_v2表示检测SQL语句的合法性
int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
if(result == SQLITE_OK){//检测SQL语句
NSLog(@"检测SQL语句成功");
//设置占位符的内容
sqlite3_bind_text(stmt, 1, "姓名1", -1, NULL);
//4.执行查询
while (sqlite3_step(stmt) == SQLITE_ROW){//表示查询到数据
//第一个参数为数据集,第二个参数表示当前第几列
int _id = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
NSLog(@"%d %s", _id, name);
}
} else {//检测SQL语句失败
NSLog(@"检测SQL语句失败");
}
}
备注:
//内连接(inner join或join):联表查询相应部门下的员工姓名
select u.name from 员工表 u inner join 部门表 d on u.dep_id = d.id
//左外连接(left outer join),保证左边的员工表所有数据都能显示出来,右边表数据不显示
select u.name from 员工表 u left outer join 部门表 d on u.dep_id = d.id