上一片篇介绍了SQL的常用语句常用的SQL语句
下面主要介绍原生数据库sqlite3的使用方法
导入libsqlite3.0.tbd框架
//sqlite3是一个轻量级的数据库,专门针对移动设备设计。
#import <sqlite3.h>
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%@",NSHomeDirectory());
//step1、创建一个数据库
NSString *path = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents/database.sqlite"];
//sqlite3_open(C语言中的函数) 打开一个数据库(如果不存在就自动创建一个数据库并将其打开) <#const char *filename#>参数表示文件路径; <#sqlite3 **ppDb#>表示用什么结构体
//[path UTF8String]将其转换为C语言中的字符串
//#define SQLITE_OK 0 打开数据库成功
//#define SQLITE_ERROR 1 打开数据库失败
if (sqlite3_open([path UTF8String], &_db) == SQLITE_OK)
{
NSLog(@"打开数据库成功!");
}
else
{
//NSAssert 断言
NSAssert(NO, @"程序执行不下去了!");
}
//step2、创建表
NSString *sql = @"CREATE TABLE IF NOT EXISTS people(name TEXT,number TEXT)";
//sqlite3_exec 执行一条sql语句。
//<#sqlite3 *#>,执行的数据库 ; <#const char *sql#>, 要执行的SQL语句(也需要转换为C语言); 第三个参数执行完毕的回调 ; 第五个参数 是失败时的错误信息
sqlite3_exec(_db, [sql UTF8String], nil, nil, nil);
//step3、关闭数据库
//sqlite3_close(_db);
_nameArray = [[NSMutableArray alloc]init];
_numberArray = [[NSMutableArray alloc]init];
//(2)数据库的读取数据
//先查询出表中所有数据
sql = @"SELECT * FROM people";
//sqlite3_stmt 单步执行缓冲区
sqlite3_stmt *stmt;
//sqlite3_prepare_v2 将sql语句放入单步执行缓冲区准备执行
sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, nil);
//sqlite3_step(stmt) 单步执行缓冲区中的语句,如果是查询语句,那么当单步执行查询有下一行时,返回值是SQLITE_ROW。
while (sqlite3_step(stmt) == SQLITE_ROW)
{
//sqlite3_column_text 取出某一列的值
const unsigned char *name = sqlite3_column_text(stmt,0);
const unsigned char *number = sqlite3_column_text(stmt,1);
NSLog(@"%s-----------%s",name,number);
//将C语言的字符串转换成OC语言的字符串
NSString *ocName = [NSString stringWithUTF8String:(const char *)name];
NSString *ocNumber = [NSString stringWithUTF8String:(const char *)number];
[_nameArray addObject:ocName];
[_numberArray addObject:ocNumber];
}
//释放缓冲区
sqlite3_finalize(stmt);
_table.dataSource = self;
_table.delegate = self;
}
#pragma mark- button
- (IBAction)addPeopleClick:(UIButton *)sender
{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"添加联系人" message:@"输入联系人" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
//设置警告框的样式
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
[alert textFieldAtIndex:0].placeholder = @"输入姓名";
[alert textFieldAtIndex:1].secureTextEntry = NO;
[alert textFieldAtIndex:1].placeholder = @"输入电话";
[alert show];
[alert release];
}
#pragma mark- alertView
//点击警告框伤的按钮回调方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) //确定按钮的buttonIndex = 0
{
NSLog(@"1");
if ([alertView textFieldAtIndex:0].text.length>0 & [alertView textFieldAtIndex:1].text.length>0)
{
NSString *name = [alertView textFieldAtIndex:0].text;
[_nameArray addObject:name];
NSString *number = [alertView textFieldAtIndex:1].text;
[_numberArray addObject:number];
[_table reloadData];
//(1)把新添加的联系人存入数据库
NSString *sql = [NSString stringWithFormat:@"INSERT INTO people VALUES('%@','%@')",name,number];
//执行sql语句
sqlite3_exec(_db, [sql UTF8String], nil, nil, nil);
}
}
else //取消按钮的buttonIndex = 0
{
NSLog(@"0");
}
}
#pragma mark- table
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//名字和电话号的数组长度一样,随便返回哪个长度都行
return _nameArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [_table dequeueReusableCellWithIdentifier:@"cell"];
if (!cell)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
//TableViewCell的样式 UITableViewCellStyleValue1
}
cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [_numberArray objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
//先从数据库中删除数据
NSString *sql = [NSString stringWithFormat:@"DELETE FROM people WHERE number = '%@'",[_numberArray objectAtIndex:indexPath.row]];
sqlite3_exec(_db,[sql UTF8String],nil,nil,nil);
//再从数据源数组中删除
[_nameArray removeObjectAtIndex:indexPath.row];
[_numberArray removeObjectAtIndex:indexPath.row];
[_table reloadData];
}
效果如下: