首页 > 代码库 > iOS sqlite

iOS sqlite

使用sqlite数据库

我想写一篇文章来将数据库基础的东西整理一下,作为新手,学过去不用马上就会忘了,我想忘了的时候拿出来一看就能懂,马上回忆起来。

xcode库:

技术分享


在sqlite操作的类中需要导入

#import <sqlite3.h>

sqlite数据类型

  • integer 带符号的整数类型;
  • real  浮点类型
  • text 字符串类型
  • blob 二进制大对象类型,能够存放任何二进制数据。
sql中只有这四种数据类型,当需要其他类型如时间类型时,需要用上述类型来替换,比如text类型

sqlite常用函数
以下代码中的变量声明:

static sqlite3 *sqliteDB;
NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"baidumap.sqlite"];//将数据库放在该目录下
sqlite3_stmt *stmt;//语句对象



sqlite3_stmt语句对象(数据库操作语句的对象,用来操作sql语句的)
sqlite3_prepare_v2将sql语句转为二进制语句,绑定操作等都需要用到


sqlite3函数为纯C语言函数,在调用时,特别是传参时注意类型的转换。

sqlite3_open 函数打开数据库。(操作数据库前先打开数据)
第一个参数是数据库文件的完整路径 是一个char*的UTF-8类型的数据,第二个参数是sqlite指针变量的地址;返回类型是int类型;

int result = sqlite3_open(filename.UTF8String, &sqliteDB);


sqlite3_exec函数执行sql语句。(进行建表、插入、删除等sql语句都可以用该函数运行)
第一个参数是sqlite3指针变量的地址,第二个参数是要执行的sql语句(注意类型转换),第三个参数是要回调的函数,第四个参数是要回调函数的参数,第五个参数是要执行出错的字符串。

 int result = sqlite3_exec(sqliteDB, sqlchar, NULL, NULL, &errorMesg);



sqlite3_close函数释放资源。
原则上无论正常还是异常结束,必须使用改函数来sqlite3释放资源;

sqlite3_close(sqliteDB);


sqlite3_prepare_v2函数预处理sql语句。

预处理的目的是将sql编译成二进制代码,提高sql语句的执行速度。

第一个参数是sqlite3数据库,第二个参数是sql语句,第三个参数是sql语句字符串的长度(填写-1即可),第四个参数是sqlite3_stmt指针的地址,第五个参数是sql没有执行的部分语句。


 int result = sqlite3_prepare_v2(sqliteDB, sql , -1, &stmt, NULL);


sqlite3_bind_text函数用来绑定文本参数。(如果sql语句中带有?,则这个问号为占位符,就需要词函数来绑定参数)

sqlite3_bind_int函数用来绑定整型参数。

sqlite3_bind_double函数用来绑定浮点参数。

sqlite3_bind_blob函数用来绑定二进制参数。

。。。。。。

第一个参数是sqlite3_stmt指针的类型的参数,第二个参数为序号(从1开始),第三个参数为字符串,第四个是字符串的长度,第五个参数是一个函数指针。


sqlite3_bind_text(stmt, 1, startime.UTF8String, -1, NULL);


sqlite3_step函数执行sql语句,遍历结果集。(例如查询语句查询出20条数据后,需要用该函数来一条一条的遍历取出)

参数为sqlite3_stmt指针,返回int类型;


sqlite3_step(stmt)


下面是一类函数用来取值(例如取出当前这行数据中得第n个字段中得值需要用到此函数)

sqlite3_column_text 函数提取第n个字段中的字符串数据。

sqlite3_column_blob 函数提取第n个字段中的二进制数据。

sqlite3_column_double 函数提取第n个字段中的浮点型数据。

sqlite3_column_int函数提取第n个字段中的整型数据。

sqlite3_column_int64 函数提取第n个字段中的64位整型数据。

sqlite3_column_text16 函数提取第n个字段中的长度为16的text数据。


NSNumber *latitude = [NSNumber numberWithFloat: sqlite3_column_int(stmt, 0)];
            NSNumber *longetude = [NSNumber numberWithFloat: sqlite3_column_int(stmt, 1)];


sqlite3_finalize 函数用来删除sqlite3_stmt 对象(当上文中声明了sqlite3_stmt对象时调用)


sqlite3_finalize(stmt);


例子


下面附加上一个查询函数用来总结一下这些函数总的用法

+ (NSMutableArray *)query:(NSString *)startime :(NSString *)endtime
{
    //打开数据库
    NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"baidumap.sqlite"];
    int result = sqlite3_open(filename.UTF8String, &sqliteDB);
    
    if (result == SQLITE_OK) {
        NSLog(@"打开数据库成功");
        
        //sql语句
        NSString *sqlstr = @"SELECT latitude,longetude FROM location_record WHERE time > ? AND time < ?";
        //类型转换
        const char *sql = sqlstr.UTF8String;
        //初始化语句对象
        sqlite3_stmt *stmt;
        //sql语句预处理
        result = sqlite3_prepare_v2(sqliteDB, sql , -1, &stmt, NULL);
        //初始化查询结果语句
        NSMutableArray *locationArray = [NSMutableArray array];
        
        if (result == SQLITE_OK) {
            //对sql语句中的?进行参数绑定
            sqlite3_bind_text(stmt, 1, startime.UTF8String, -1, NULL);
            sqlite3_bind_text(stmt, 2, startime.UTF8String,-1 , NULL);
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                //获取字段值
                NSNumber *latitude = [NSNumber numberWithFloat: sqlite3_column_int(stmt, 0)];
                NSNumber *longetude = [NSNumber numberWithFloat: sqlite3_column_int(stmt, 1)];
                //保存到数组
                [locationArray addObject:latitude];
                [locationArray addObject:longetude];
            }
        }
        //删除语句对象
        sqlite3_finalize(stmt);
        //关闭数据库
        sqlite3_close(sqliteDB);
        return locationArray;
    }
    else
    {
        NSLog(@"打开失败");
        //关闭数据库
        sqlite3_close(sqliteDB);
        return nil;
    }
}




iOS sqlite