上一片篇介绍了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]; }