0.准备工作
// 导入sqlite3框架,必要时导入相应xi't
#import <sqlite3.h>
// 声明一个数据库属性
@property (nonatomic, assign) sqlite3 *db;
1.打开数据库并创建表
// 0.获取沙盒地址
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.打开数据
// sqlite3 *db; // 一个db就代表一个数据库
// open会先判断数据库文件是否存在, 如果不存在会自动创建数据库文件, 然后再打开数据
// open会返回一个int类型的值, 这个值代表着打开数据库是否成功
int result = sqlite3_open(sqlFilePath.UTF8String, &_db);
if (SQLITE_OK == result) {
NSLog(@"数据库打开成功");
// 2.创建表
const char *sql = "CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL DEFAULT 1);";
char *error;
/*
第1参数:需要执行sql语句的数据库
第2参数:需要执行的sql语句
第3参数:执行完sql语句之后的回调方法
第4参数:回调方法的参数
第5参数:错误信息
*/
sqlite3_exec(_db, sql, NULL, NULL, &error);
if (error) {
NSLog(@"创建表失败");
}else
{
NSLog(@"创建表成功");
}
}else
{
NSLog(@"数据库打开失败");
}
2.插入数据
for (int i = 0; i < 100; i++) {
int score = arc4random_uniform(100);
NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i];
NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(score, name) VALUES (%d, '%@');", score, name];
char *error;
sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
if (error) {
NSLog(@"插入失败");
}else
{
NSLog(@"插入成功");
}
}
3.删除数据
- (IBAction)deleteOnClick {
NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE NAME = '%@';", @"Jonathan-6"];
char *error;
sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
if (error) {
NSLog(@"删除失败");
}else
{
NSLog(@"删除成功");
}
}
4.更新数据
NSString *sql = [NSString stringWithFormat:@"UPDATE t_student SET NAME = '%@' WHERE NAME = '%@';",@"Jonathan-66", @"Jonathan-6"];
char *error;
sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
if (error) {
NSLog(@"更新失败");
}else
{
NSLog(@"更新成功");
}
5.查询数据
char *sql = "SELECT id, name, score FROM t_student;";
// char *error;
// sqlite3_exec(_db, sql, NULL, NULL, &error);
// 1.准备查询
/*
第1参数:需要执行sql语句的数据库
第2参数:需要执行的sql语句
第3参数:sql语句长度, 如果传递一个小于0的数, 系统会自动帮我们计算
第4参数:用于提取数据的变量
*/
sqlite3_stmt *stmt; // 用于提取数据的变量
int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
// 2.判断是否准备好
if (SQLITE_OK == result) {
// 准备好了
// 2.1提取数据
// step方法会将数据提取到stmt中, 一次只能提取一条数据
// int row = sqlite3_step(stmt);
while (SQLITE_ROW == sqlite3_step(stmt)) { // 提取到一条数据
// 从stmt中取出提取到的数据
int ID = sqlite3_column_int(stmt, 0);
const unsigned char * name = sqlite3_column_text(stmt, 1);
double score = sqlite3_column_double(stmt, 2);
NSLog(@"%d %s %.1f", ID, name, score);
}
}
6.封装重复的操作
对于创建表、插入、更新、删除操作,我们都可以调用下面的方法,返回为YES代表执行成功,反之则失败。
- (BOOL)sqliteExecOperation:(NSString *)sql
{
return sqlite3_exec(_db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK;
}