亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發之SQLite--C語言接口規范(三)——BindingValuesToPreparedStatements

2019-11-14 18:18:29
字體:
來源:轉載
供稿:網友

  在前面的博客中已經介紹了如何連接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_*()的方法。

 

  二、值綁定

    先簡單介紹一下什么是值綁定吧。用大白話說,值綁定就是在SQL語句預編譯時把一些參數使用占位符(這里是?號)來代替,然后與程序中的變量進行綁定。類似于字符串的格式化。如果你之前搞過java的JDBC或者php, 在他們操作數據庫執行SQL語句時都有類似值綁定的一個概念。 就是把外界變量把SQL語句占位的值進行替換。值綁定經常在SELECT,INSERT,UPDATE等語句中進行使用。

    1.為預編譯SQL語句綁定變量,綁定不同類型變量需要不同的綁定接口,下方是常用的綁定變量的接口。

            

    2.在sqlite3_prepare_v2()輸入的SQL語句的文本中,下面的這些參數將會被替換掉,在下面的參數中,NNN表示一個整數(這個整數就代表這個參數的索引),VVV代表一個字母標示符(參數的名字)??梢允褂?span style="color: #ff6600;">sqlite3_bind_*()函數為上面的這些占位符進行賦值。

    

    說的直白一些,“?”號就是匿名參數,從第一個問號出現往后的索引默認是1,往后以此類推。而“?NNN”是為匿名參數指定索引,你可以這樣寫“?1” , "?2"等,而:VVV, @VVV, $VVV這些就是有名參數了,VVV就是參數的名字。比如:ludashi, @ludashi, $ludashi。 

    下面的實例給出了參數不同的幾種表現形式, 前一種是匿名參數,后邊參數就有自己的名字了。

    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.每個綁定函數的使用場景 

   

    (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語句中參數的個數,這些參數可以是匿名參數,也可以是有名參數。

    

    具體用法如下:

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

 

   (2)通過索引獲取對應參數的名稱

    

    具體用法如下:

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

 

    (3) 在一個是通過名字獲取索引了,正好和上面的方法相反。

    

  調用方式如下:

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數據庫的東西會繼續更新。 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久国产| 日韩最新av在线| 国产成人高潮免费观看精品| 91在线视频免费| 国内外成人免费激情在线视频| 欧美黄色片视频| 欧美怡红院视频一区二区三区| 日韩在线免费高清视频| 成人国内精品久久久久一区| 日韩电影免费观看在线观看| 久久久久国产精品免费网站| 日韩欧美福利视频| 97人洗澡人人免费公开视频碰碰碰| 色综合91久久精品中文字幕| 96精品视频在线| 国产美女91呻吟求| 国产精品美女久久久久av超清| 亚洲男人天堂2024| 中文字幕在线观看亚洲| 欧美超级免费视 在线| 欧美成人精品h版在线观看| 亚洲女人初尝黑人巨大| 色噜噜国产精品视频一区二区| 国产精品欧美一区二区三区奶水| 91亚洲国产成人久久精品网站| 久久精品99久久香蕉国产色戒| 国产精品旅馆在线| 91免费在线视频| 日韩精品有码在线观看| 欧美猛交免费看| 国产精品爱啪在线线免费观看| 国产成人午夜视频网址| 777午夜精品福利在线观看| 91精品视频观看| www.美女亚洲精品| 97人人模人人爽人人喊中文字| 欧美xxxx综合视频| 粉嫩老牛aⅴ一区二区三区| 国产精品99久久久久久www| 成人国产精品av| 久久激情视频久久| 国产精品视频精品| 日产精品久久久一区二区福利| 久久久久久亚洲精品| 亚洲大胆人体在线| 国产精品久久久久久久久久新婚| 久久久久国产精品www| 国产婷婷成人久久av免费高清| 日韩亚洲一区二区| 国产亚洲精品高潮| 久久久亚洲国产| 久操成人在线视频| 国产精品成人在线| 亚洲精品美女久久| 色婷婷综合成人| 夜夜躁日日躁狠狠久久88av| 国产又爽又黄的激情精品视频| 色综合91久久精品中文字幕| 国产精品日韩精品| 中文字幕精品久久久久| 久久久成人精品| 国产成人精品电影久久久| 日韩精品视频在线观看网址| 亚洲视频欧洲视频| 国产视频精品va久久久久久| 91日本视频在线| 国产亚洲欧洲高清| 日韩中文字幕视频| 精品久久久视频| 国产视频久久久久| 国产在线视频一区| 成人久久18免费网站图片| 亚洲欧美国内爽妇网| 欧美日韩国产专区| 国产日韩在线亚洲字幕中文| 精品免费在线视频| 美女啪啪无遮挡免费久久网站| 成人av番号网| 91精品国产高清久久久久久| 色噜噜狠狠狠综合曰曰曰| 亚洲精品国产精品自产a区红杏吧| 2019最新中文字幕| 性欧美xxxx视频在线观看| 一区二区欧美激情| 日韩精品极品在线观看播放免费视频| 国产综合福利在线| 日韩精品有码在线观看| 精品国产一区二区三区久久久狼| 国产精品99久久久久久久久久久久| 色悠悠久久88| 久久精品一偷一偷国产| 日韩在线视频免费观看高清中文| 精品久久久久久| 欧美一乱一性一交一视频| 国产精品影院在线观看| 国产精品高清免费在线观看| 欧美性高跟鞋xxxxhd| 国产成人精彩在线视频九色| 亚洲香蕉伊综合在人在线视看| 欧美大尺度在线观看| 国产va免费精品高清在线观看| 亚洲影院色在线观看免费| 777777777亚洲妇女| 亚洲免费一级电影| 久操成人在线视频| 丝袜亚洲欧美日韩综合| 一区二区三区www| 成人亚洲欧美一区二区三区| 欧美日韩xxxxx| 亚洲女同精品视频| 亚洲欧美中文日韩v在线观看| 一区二区三区四区在线观看视频| 欧美午夜精品伦理| 国产精品扒开腿做爽爽爽视频| 欧美激情亚洲视频| 一个人看的www久久| 亚洲欧美国产高清va在线播| 日韩中文在线中文网三级| 亚洲v日韩v综合v精品v| 欧美视频一区二区三区…| 韩国欧美亚洲国产| 欧美丝袜美女中出在线| 日韩av免费在线播放| 亚洲最大的成人网| 91色琪琪电影亚洲精品久久| 国产午夜精品视频| 亚洲男人天堂久| 欧美激情第1页| 精品在线欧美视频| 一区二区三区视频观看| 69久久夜色精品国产7777| 日韩av不卡在线| 久久免费少妇高潮久久精品99| 欧美日韩日本国产| 日韩一区二区欧美| 久久久亚洲精选| 色悠悠国产精品| 色偷偷88888欧美精品久久久| 久久人人爽亚洲精品天堂| 最近中文字幕mv在线一区二区三区四区| 国产日韩在线播放| 国产精品久久视频| 91精品久久久久久久久久入口| 97精品国产97久久久久久| 米奇精品一区二区三区在线观看| 亚洲欧美在线播放| 69精品小视频| 亚洲精品久久久久中文字幕二区| 不卡毛片在线看| 中文字幕综合在线| 亚洲精品黄网在线观看| 亚洲欧美中文日韩v在线观看| 成人激情视频在线观看| 国产91精品久久久| 国产一区二区三区久久精品| 91久久精品视频| 欧美激情亚洲综合一区| 久久久久久久久综合| 欧美激情精品久久久久久| 91久久精品国产91性色| 亚洲天堂av在线免费观看| 欧美性xxxx极品高清hd直播| 午夜剧场成人观在线视频免费观看| 国产精品日日摸夜夜添夜夜av|