【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环

【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环,第1张

概述(1)注意点: 在SELECT查询时,不能分步写成如下形式,否则会出现死循环: int stepResult=sqlite3_step(statement);while (stepResult==SQLITE_ROW) {}只能合并成一句写成: while (sqlite3_step(statement)==SQLITE_ROW) { } 因为,sqlite3_step的

(1)注意点:

在SELECT查询时,不能分步写成如下形式,否则会出现死循环:

int stepResult=sqlite3_step(statement);while (stepResult==sqlITE_ROW) {}
只能合并成一句写成:
while (sqlite3_step(statement)==sqlITE_ROW) {         }

因为,sqlite3_step的执行方式是如下:

** ^If the sql statement being executed returns any data,then [sqlITE_ROW]

** is returned each time a new row of data is ready for processing by the

** caller. The values may be accessed using the [column access functions].

** sqlite3_step() is called again to retrIEve the next row of data.


#import "VIEwController.h"#import <sqlite3.h>@interface VIEwController ()- (IBAction)insert:(ID)sender;- (IBAction)delete:(ID)sender;- (IBAction)update:(ID)sender;- (IBAction)select:(ID)sender;@end@implementation VIEwControllerstatic sqlite3 *_db;- (voID)vIEwDIDLoad {    [self setupDatabaseAndtable];    [super vIEwDIDLoad];    // Do any additional setup after loading the vIEw,typically from a nib.}- (voID)dIDReceiveMemoryWarning {    [super dIDReceiveMemoryWarning];    // dispose of any resources that can be recreated.}-(voID)setupDatabaseAndtable{    Nsstring *filename=[[NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent:@"iOS.sql"];    NSLog(@"%@",filename);        int openDBResult=sqlite3_open(filename.UTF8String,&_db);        if (openDBResult==sqlITE_OK) {        //创建表        Nsstring *createtablesql=@"CREATE table IF NOT EXISTS user (ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,age INTEGER);";        char *error=nil;        int createtableResult=sqlite3_exec(_db,createtablesql.UTF8String,NulL,&error);        if (createtableResult==sqlITE_OK) {            NSLog(@"创建表成功");        }else{            NSLog(@"创建表失败");        }        NSLog(@"打开数据库成功");    }else{        NSLog(@"打开数据库失败");    }}- (IBAction)insert:(ID)sender {    for (int i=0; i<50; i++) {        Nsstring *name=[Nsstring stringWithFormat:@"jack%d",arc4random()%100];        int age=arc4random()%100;        Nsstring *inserttablesql=[Nsstring stringWithFormat:@"INSERT INTO user(name,age) VALUES('%@',%d);",name,age];        char *error=nil;        int insertResult=sqlite3_exec(_db,inserttablesql.UTF8String,&error);        if (insertResult==sqlITE_OK) {            NSLog(@"%d %@ %d",i,age);        }else{            NSLog(@"插入数据失败");        }    }}- (IBAction)delete:(ID)sender {    Nsstring *deleteRowsql=@"DELETE FROM user WHERE ID=1;";    char *error=nil;    int deleteResult=sqlite3_exec(_db,deleteRowsql.UTF8String,&error);    if (deleteResult==sqlITE_OK) {        NSLog(@"删除数据成功");    }else{        NSLog(@"删除数据失败");    }}- (IBAction)update:(ID)sender {    Nsstring *updateRowsql=@"UPDATE user SET age=130 WHERE ID=3;";    char *error=nil;    int updateResult=sqlite3_exec(_db,updateRowsql.UTF8String,&error);    if (updateResult==sqlITE_OK) {        NSLog(@"修改数据库成功");    }else{        NSLog(@"修改数据库失败");    }}- (IBAction)select:(ID)sender {    Nsstring *selectRowsql=@"SELECT ID,age FROM user WHERE ID=5;";    sqlite3_stmt *statement;    int stmtResult=sqlite3_prepare_v2(_db,selectRowsql.UTF8String,-1,&statement,nil);    if (stmtResult==sqlITE_OK) {        NSLog(@"stmtResult成功");        //以下语句分步写会出现死循环        while (sqlite3_step(statement)==sqlITE_ROW) {            NSLog(@"stepResult成功");            int uID=sqlite3_column_int(statement,0);            const unsigned char *uname=sqlite3_column_text(statement,1);            int uage=sqlite3_column_int(statement,2);            NSLog(@"%d %s %d",uID,uname,uage);        }    }else{        NSLog(@"stmtResult失败");    }}@end

(2)防止sql注入的简单处理,利用sqlite3_bind_text(int)等进行变量绑定,这个语句会对输入的字符进行处理。

- (IBAction)select:(ID)sender {    Nsstring *selectRowsql=@"SELECT ID,age FROM user WHERE name=?;";    sqlite3_stmt *statement;    int stmtResult=sqlite3_prepare_v2(_db,nil);    if (stmtResult==sqlITE_OK) {        NSLog(@"stmtResult成功");        sqlite3_bind_text(statement,1,"jack1",NulL);        //以下语句分步写会出现死循环        while (sqlite3_step(statement)==sqlITE_ROW) {            NSLog(@"stepResult成功");            int uID=sqlite3_column_int(statement,uage);        }    }else{        NSLog(@"stmtResult失败");    }}

(3)liKE模糊查询关键词的使用,需要注意的是查询的词的两边需要各增加一个%,而如果用变量替换用转义的话,需要使用%%表示%,所以一般格式是“%%关键字%%”。
- (IBAction)select:(ID)sender {    Nsstring *selectRowsql=@"SELECT ID,age FROM user WHERE name liKE ?;";    sqlite3_stmt *statement;    int stmtResult=sqlite3_prepare_v2(_db,"%%jack1%%",uage);        }    }else{        NSLog(@"stmtResult失败");    }}
总结

以上是内存溢出为你收集整理的【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环全部内容,希望文章能够帮你解决【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170992.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存