iOS开发—sqlite3的使用

来源:互联网 发布:linux 启动oracle进程 编辑:程序博客网 时间:2024/05/18 00:23

一、SQLite简介
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。

二、简单介绍sqlite3的常用方法
sqlite3_stmt          这个相当于ODBC的Command对象,用于保存编译好的sql语句
sqlite3_open()       打开数据库,没有数据库时则创建
sqlite3_exec()       执行非查询的sql语句
Sqlite3_step()       这个过程用于执行前面有sqlite3_prepare创建的准备语句
sqlite3_finalize()    这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。
Sqlite3_close()      关闭数据库文件。这个过程关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放

还有一系列的函数,用于从记录集字段中获取数据,如:
sqlite3_column_text()          读取text类型(文本字符串)的数据
sqlite3_column_blob()         读取blob类型(二进制数据,比如文件、图片之类)的数据
sqlite3_column_int()            读取int类型的数据



三、创建(或打开)数据库
必要条件:导入头文件 #import <sqlite3.h>

#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);

}


上图便是我们创建的数据库在app中的指定位置。



四、创建一张表
【注意】由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串 char*,好在Nsstring提供了转换的方法,那就是 UTF8String。

-(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(@"删除数据失败");

    }

   

}