sqlite3原生数据库简单使用

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

效果如下:



你可能感兴趣的:(sqlite3)