例子:
#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()
@end
@implementation ViewController
{
// 成员变量/数据库实例
sqlite3 *_db;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"touchesBegan");
// 利用 OC 代码模拟数据库操作!
// 所有的关于数据库的操作函数,都是以 sqlite3 开头!
// 1. 创建一个数据库文件(沙盒中!),并且利用sqlite3 函数打开这个数据库!
// 2. 打开数据库成功之后,创建"表",用来存储数据!
// 3. 向"表"中插入数据!
// 4. 更新和删除表中的数据!
// 5. 根据需求从表中取出数据(查询数据!).
// Caches 文件路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
// 数据库文件路径
NSString *filePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 打开数据库
// sqlite3 **ppDb : 数据库实例.
int result = sqlite3_open(filePath.UTF8String, &_db);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功!");
NSLog(@"%@",filePath);
// 创建"表",SQL语句!
NSString *sql = @"CREATE TABLE IF NOT EXISTS \"t_student\" (\"id\" INTEGER PRIMARY KEY AUTOINCREMENT , \"name\" TEXT ,\"age\" INTEGER ,\"score\" REAL);";
char *errorMessage;
// 执行 SQL 语句,建 "表"
int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMessage);
if (result == SQLITE_OK) {
NSLog(@"t_student 表创建成功!");
// 插入数据!
// [self insetIntoStudent];
// 查询数据
[self selectDataFromStusent];
}else
{
NSLog(@"表创建失败");
NSLog(@"errorMessage:%s",errorMessage);
}
}else
{
NSLog(@"数据库打开失败!");
}
//关闭数据库!
sqlite3_close(_db);
}
// 查询数据!
-(void)selectDataFromStusent
{
// 1. sql语句
NSString *sql = @"SELECT name,age,score FROM \"t_student\" LIMIT 10,10;";
// 2. 检查查询语句的合法性!
// stmt :用来存放查询到的数据!
sqlite3_stmt *stmt;
// -1 /自动匹配长度!
int result = sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"查询语句合法!");
while (sqlite3_step(stmt) == SQLITE_ROW) {
// NSLog(@"查询到一条数据!");
// 取出查询到的数据!
// 参数: 1. 查询到的数据存储的位置
// 2. 取第几列的数据!
const unsigned char *name = sqlite3_column_text(stmt, 0);
int age = sqlite3_column_int(stmt, 1);
double score = sqlite3_column_double(stmt, 2);
NSLog(@"name:%s %d %.2f",name,age,score);
// 服务器: 将这些数据写成 JSON 之后,放在服务器,然后利用网络访问!
// 客户端: 将数据转换成模型数据,添加到数据源中,直接使用!
}
// 释放stmt
sqlite3_finalize(stmt);
}else
{
NSLog(@"查询语句不合法!");
}
// 3. 获得查询到的数据!
}
// NSLog(@"查询到一条数据!");
//
// // 取出查询到的数据!
// // 参数: 1. 查询到的数据存储的位置
// // 2. 取第几列的数据!
// const unsigned char *name = sqlite3_column_text(stmt, 0);
//
// int age = sqlite3_column_int(stmt, 1);
//
// double score = sqlite3_column_double(stmt, 2);
//
// NSLog(@"name:%s %d %.2f",name,age,score);
// 作业: 自己完成 删除 和 更新 数据!
// 删除: age > 30 并且 score < 80;
// 将 age > 30 的数据 age 变成 28;
// 插入数据!
- (void)insetIntoStudent
{
// 插入多条数据!
for (int i = 0 ; i < 50; i++) {
NSString *name = [NSString stringWithFormat:@"zhangsan%d",i];
NSInteger age = arc4random()%30+20;
NSInteger score = arc4random()%50+50;
// 1. SQL 语句
// NSString *sql = @" INSERT INTO \"t_student\" (\"name\",\"age\",\"score\") VALUES (\"lisi\",20,98);";
NSString *sql = [NSString stringWithFormat:@"INSERT INTO \"t_student\" (\"name\",\"age\",\"score\") VALUES (\"%@\",%ld,%ld);",name,age,score];
// 2. 执行 SQL 语句
char *errorMessage;
int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMessage);
if (result == SQLITE_OK) {
NSLog(@"数据插入成功!");
}else
{
NSLog(@"数据插入失败! %s",errorMessage);
}
}
}
@end