sqliteiOS开发之SQLite–C语言接口规范(三)——Binding Values To Prepared Statements

  在前方的博客中早已介绍了什么连接SQLite数据库,并且不难的询问和遍历结果集。在眼前用到了sqlite3_stmt
*stmt,也就是预编译后的SQL语句。在本篇博客中会通晓一下sqlite3_stmt,然后通晓一下变量的绑定。变量绑定,简单来说就是往预编译后的SQL语句中盛传相应的值。

  一.
sqlite3_stmt 的生命周期

  这几个目标的实例代表着一个被编译成二进制的SQL语句。每个SQL语句都无法不透过预编译转换成sqlite3_stmt才能被执行。在iOS开发中,Application或者UIViewController等都是有自己的生命周期的,预编译语句也是有温馨的生命周期的,其生命周期如下:

    1.sqlite3_stmt对象的人命起点于sqlite3_prepare_v2(),
使用sqlite3_prepare_v2()可以创造sqlite3_stmt对象。

    2.使用sqlite3_bind_*()接口可以给sqlite3_stmt对象绑定变量。

    3.调用sqlite3_step()两回依然频仍来运行SQL语句。

    4.调用sqlite3_reset()回去上一回实践的SQL语句,你可以调用sqlite3_reset()多次,sqlite3_reset()更像版本管理中的回滚操作。

    5.使用sqlite3_finalize()析构函数来释放sqlite3_stmt对象。

  sqlite3_stmt对象的构造函数(推荐使用“v2”接口):sqlite3_prepare(), sqlite3_prepare16(),
sqlite3_prepare16_v2(),
sqlite3_prepare_v2()

  sqlite3_stmt对象的析构函数:sqlite3_finalize()

   下方是关于sqlite3_stmt对象的接口,本篇博客主要介绍有关sqlite3_bind_*()的方法。

sqlite 1

 

  二、值绑定

    先简单介绍一下如何是值绑定吧。用大白话说,值绑定就是在SQL语句预编译时把有些参数使用占位符(那里是?号)来替代,然后与程序中的变量进行绑定。类似于字符串的格式化。要是你从前搞过Java的JDBC或者PHP,
在她们操作数据库执行SQL语句时都有类似值绑定的一个定义。
就是把外场变量把SQL语句占位的值举办轮换。值绑定平常在SELECT,INSERT,UPDATE等语句中开展利用。

    1.为预编译SQL语句绑定变量,绑定不一致品种变量须求差其他绑定接口,下方是常用的绑定变量的接口。

            sqlite 2

    2.在sqlite3_prepare_v2()输入的SQL语句的文书中,上边的那几个参数将会被沟通掉,在上面的参数中,NNN表示一个平头(那几个平头就意味着那几个参数的目录),VVV代表一个字母标示符(参数的名字)。可以利用sqlite3_bind_*()函数为地点的这么些占位符进行赋值。

    sqlite 3

    说的第一手一些,“?”号就是匿名参数,从首个问号出现将来的目录默许是1,将来以此类推。而“?NNN”是为匿名参数指定索引,你可以这么写“?1”
, “?2″等,而:VVV, @VVV,
$VVV那一个就是盛名参数了,VVV就是参数的名字。比如:ludashi, @ludashi,
$ludashi。 

    上面的实例给出了参数分化的两种表现格局,
前一种是匿名参数,前边参数就有自己的名字了。

sqlite 4

    3.sqlite3_bind_*()参数介绍(那么些绑定函数执行成功后回再次来到SQLITE_OK,
执行不成事的话回重临相应的错误代码)

      (1) sqlite3_bind_*()的第二个参数是含有上述占位符预编译后的言辞指针,也就是sqlite3_stmt的对象。

      (2) sqlite3_bind_*()的第三个参数是SQL语句中参数的目录,例如第二个参数的索引值是1,那么就传1。匿名参数的目录是从1初步以后递增的,而有参数名称的可以由此sqlite3_bind_parameter_index()接口传入参数名称来博取该参数的目录,sqlite3_bind_parameter_index()用法如下,第二个参数是sqlite3_stmt的靶子,而后面的参数是SQL参数名称,再次回到值就是该参数的目录。

int index = sqlite3_bind_parameter_index(statement, "$brandidMin");

      (3) 第两个参数是要绑定的值。

      (4) sqlite3_bind_blob(), sqlite3_bind_text()和sqlite3_bind_text16()那七个接口中还有有第四和首个参数,第八个参数代表第七个参数“绑定值”的字节长度。第多个参数是一个对准内存管理回调函数的指针。

   4.各样绑定函数的利用场景 

  sqlite 5 

    (1)
BLOB是数据库中贮存大数额的一种数据类型,它是以二进制的样式来储存数据的。

1         SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));    

 

    (2) 顾名思义,上面的艺术是绑定double类型的数据的

1         SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);    

 

    (3) 绑定一个32位的整型值

1         SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);

 

    (4) 绑定一个64位的整型值

1         SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);

 

    (5)绑定一个NULL的值(在数据库中可以为NULL)

1         SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);

 

    (6)绑定一个UTF-8编码的字符串,第八个参数方面也论及了,是绑定字符串的尺寸,即使为负值的话,就是传多少就绑定多少。

1         SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));

 

    (7)绑定一个UTF-16编码的字符串,第多个参数方面也提到了,是绑定字符串的长短,要是为负值的话,就是传多少就绑定多少。

1         SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));    

 

    (8)
绑定sqlite3_value结构体类型的值,sqlite3_value结构体可以保留任意格式的数码。

        SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);    

 

    (9)绑定一个随机长度的BLOB类型的二进制数据,它的每一个字节被置0。第3个参数是字节长度。那么些函数的例外用途是,创制一个大的BLOB对象,之后方可因此BLOB接口函数进行更新。

1         SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);

 

  5.值绑定常用工具函数

  (1)下方的函数重返预编译SQL语句中参数的个数,这个参数可以是匿名参数,也得以是老牌参数。

    sqlite 6

    具体用法如下:

1     int count = sqlite3_bind_parameter_count(statement);
2     NSLog(@"%d", count);

 

   (2)通过索引获取相应参数的称呼

    sqlite 7

    具体用法如下:

1     const char * name = sqlite3_bind_parameter_name(statement, 1);
2     NSLog(@"%s", name);

 

    (3) 在一个是通过名字获取索引了,正好和方面的主意相反。

    sqlite 8

  调用格局如下:

1         int index = sqlite3_bind_parameter_index(statement, ":brandidMax");
2         NSLog(@":brandidMax——index = %d", index);

 

  三、值绑定实例

  上边的实例是在查询语句中使用值绑定,绑定完值后,调用查询数据库的法子,然后举行数值的输出,因为地点说的够多了,上面的代码就不用加注释了。

 1 -(void) qureyInfoWithDataBase2: (sqlite3 *) database{
 2     
 3     NSString * qureyInfo = @"SELECT * FROM CARBRAND WHERE BRANDID > :brandidMin AND BRANDID < :brandidMax";
 4     
 5     sqlite3_stmt *statement;
 6     
 7     const char * zSql = [qureyInfo UTF8String];
 8     
 9     int result = sqlite3_prepare_v2(database, zSql, -1, &statement, nil);
10     
11     int count = sqlite3_bind_parameter_count(statement);
12     NSLog(@"count = %d", count);
13     
14     const char * name = sqlite3_bind_parameter_name(statement, 1);
15     NSLog(@"name = %s", name);
16     
17     if (result == SQLITE_OK) {
18         
19         int index = sqlite3_bind_parameter_index(statement, ":brandidMax");
20         NSLog(@":brandidMax_index = %d", index);
21         
22         //值绑定
23         sqlite3_bind_int(statement, 1, 180);
24         sqlite3_bind_int(statement, 2, 200);
25         
26         [self queryUserInfoWith: database WithStatement: statement];
27     }
28     
29 }

  

  查询数据库的章程

 1 //查询数据库
 2 - (void) queryUserInfoWith: (sqlite3 *) database WithStatement: (sqlite3_stmt *) statement {
 3         
 4     while (sqlite3_step(statement) == SQLITE_ROW) {
 5         
 6         int rowNum = sqlite3_column_int(statement, 0);
 7         
 8         char *rowDataOne = (char *) sqlite3_column_text(statement, 1);
 9         
10         char *rowDataTow = (char *) sqlite3_column_text(statement, 2);
11         
12         NSString *nameString = [NSString stringWithUTF8String:rowDataOne];
13         
14         NSString *firstLetterString = [NSString stringWithUTF8String:rowDataTow];
15         
16         NSLog(@"BrandId = %d, Name = %@, FirstLetter = %@",rowNum , nameString, firstLetterString);
17         
18     }
19     sqlite3_finalize(statement);
20     
21 }

  输入结果如下:

    sqlite 9

 后天博客就先到那时候,关于SQLite数据库的东西会持续创新。 

网站地图xml地图