sqlite3_open() 打开数据库,没有数据库时则创建
sqlite3_exec() 执行非查询的sql语句
Sqlite3_step() 这个过程用于执行前面有sqlite3_prepare创建的准备语句
sqlite3_column_blob() 读取blob类型(二进制数据,比如文件、图片之类)的数据
sqlite3_column_int() 读取int类型的数据
#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()
{
sqlite3 *database;
}
//首先自定义一个方法,返回我们当前应用程序沙盒目录(也就是说希望数据库保存在哪里)
-(NSString *) dataFilePath{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *document = [path objectAtIndex:0];
return [document stringByAppendingPathComponent:@"data.sqlite"];
}
-(void)creatDatabase{
//在指定位置创建或打开一个数据库
//SQLITE_OK是sqlite3的一个常量,代表操作执行成功
if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {
NSLog(@"数据库创建失败!");
sqlite3_close(database);
}
NSLog(@"数据库创建成功!");
// NSString* path = [self dataFilePath];
// NSLog(@"%@",path);
}
-(void)creatTable{
//创建了一张名为myTable的数据库表,其中有一个自增的id,和name,age,sex,weight,address五个属性。
NSString *createSQL = @"create table if not exists myTable(id integer primary key autoincrement,name text,age integer,sex text,weight integer,address text)";
char *error;
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &error)!=SQLITE_OK){
NSLog(@"表创建失败");
}
NSLog(@"表创建成功!");
}
-(void)queryTableData{
NSString *queryStr = @"select * from myTable";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, [queryStr UTF8String], -1, &stmt, nil) == SQLITE_OK) {
//当查询语句执行成功时,使用sqlite3_step当游标指向每一行SQLITE_ROW时,我们开始读取数据
while (sqlite3_step(stmt)==SQLITE_ROW) {
//sqlite_3_column_text可以读取字符串类型的数据,参数二为column号;sqlite_3column_int读取int类型数据
char *name = (char *)sqlite3_column_text(stmt, 1);
NSString *nameString = [[NSString alloc] initWithUTF8String:name];
NSLog(@"nameString==%@",nameString);
int age = sqlite3_column_int(stmt, 2);
NSString* ageStr = [NSString stringWithFormat:@"%d",age];
NSLog(@"ageStr==%@",ageStr);
char *sex = (char *)sqlite3_column_text(stmt, 3);
NSString *sexString = [[NSString alloc] initWithUTF8String:sex];
NSLog(@"sexString==%@",sexString);
int weight = sqlite3_column_int(stmt, 4);
NSString* weightStr = [NSString stringWithFormat:@"%d",weight];
NSLog(@"weightStr==%@",weightStr);
char *address = (char *)sqlite3_column_text(stmt, 5);
NSString *addressString = [[NSString alloc] initWithUTF8String:address];
NSLog(@"addressString==%@",addressString);
}
//释放stmt
sqlite3_finalize(stmt);
}
//关闭数据库,释放内存
sqlite3_close(database);
}
//添加数据
-(void)insert{
NSString* insertStr = @"insert into myTable(name,age,sex,weight,address)values('老韦','29','男','146','中国上海')";
char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
int result = sqlite3_exec(database, [insertStr UTF8String], nil, nil, &error);
if (result == SQLITE_OK) {
NSLog(@"添加数据成功");
} else {
NSLog(@"添加数据失败");
}
}
//修改数据
-(void)modify{
//sql语句格式: update 表名 set 列名 = 新参数 where 列名 = 参数 注:前面的 列名 = 新参数 是修改的值, 后面的 列名 = 参数 是需要修改的地方
//把名字为‘老韦’的部分全部改成‘吉姆’
NSString* modifyStr = @"update myTable set name = '吉姆' where name = '老韦'";
char *errorMesg = NULL;
int result = sqlite3_exec(database, [modifyStr UTF8String], NULL, NULL, &errorMesg);
if (result == SQLITE_OK) {
NSLog(@"更改数据成功");
}else {
NSLog(@"更改数据失败");
}
}
//删除数据
-(void)delete{
//删除表中年龄小于或等于29的数据
NSString* deleteStr = @"delete from myTable where age <= 29";
char *errorMesg = NULL;
int result = sqlite3_exec(database, [deleteStr UTF8String], NULL, NULL, &errorMesg);
if (result == SQLITE_OK) {
NSLog(@"删除数据成功");
}else {
NSLog(@"删除数据失败");
}
}