【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环
来源:互联网 发布:淘宝搜索热度什么意思 编辑:程序博客网 时间:2024/05/21 11:05
(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, 0, &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, NULL, 0, &error); if (insertResult==SQLITE_OK) { NSLog(@"%d %@ %d",i,name,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, NULL, 0, &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, NULL, 0, &error); if (updateResult==SQLITE_OK) { NSLog(@"修改数据库成功"); }else{ NSLog(@"修改数据库失败"); }}- (IBAction)select:(id)sender { NSString *selectRowSql=@"SELECT id,name,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,name,age FROM user WHERE name=?;"; sqlite3_stmt *statement; int stmtResult=sqlite3_prepare_v2(_db, selectRowSql.UTF8String, -1, &statement, nil); if (stmtResult==SQLITE_OK) { NSLog(@"stmtResult成功"); sqlite3_bind_text(statement, 1, "jack1", -1, NULL); //以下语句分步写会出现死循环 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失败"); }}
(3)LIKE模糊查询关键词的使用,需要注意的是查询的词的两边需要各增加一个%,而如果用变量替换用转义的话,需要使用%%表示%,所以一般格式是“%%关键字%%”。
- (IBAction)select:(id)sender { NSString *selectRowSql=@"SELECT id,name,age FROM user WHERE name LIKE ?;"; sqlite3_stmt *statement; int stmtResult=sqlite3_prepare_v2(_db, selectRowSql.UTF8String, -1, &statement, nil); if (stmtResult==SQLITE_OK) { NSLog(@"stmtResult成功"); sqlite3_bind_text(statement, 1, "%%jack1%%", -1, NULL); //以下语句分步写会出现死循环 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失败"); }}
0 0
- 【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环
- 触发器会出现死循环!~~
- 不用while、for写死循环。
- JPA查询出现死循环
- java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环
- vfork为什么会出现死循环
- Perl while 死循环
- while死循环
- while 死循环
- while中使用List.iterator().hasNext()为什么会出现无限循环
- 在stm32中使用while循环导致程序卡死
- while 死循环->小坑
- shell死循环(while&&for)
- 查询BOM死循环
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- 为什么会陷入死循环
- 为什么会陷入死循环
- elasticsearch源码分析---threadpool模块
- Maximum Subarray
- eclipse 汉化版更新地址
- Robot Motion POJ 1573
- Android中 如何在本Activity页面退出后回到首页或者指定的Activity入口——诺诺"涂鸦"记忆
- 【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环
- SDUT14级寒假集训-找女朋友- 快排
- GridView(使用在TV或者盒子上)
- 【iOS7开发快速入门】代码示例3-4
- Mysql InnoDB和MyISAM的主要区别
- 9.Hibernate的检索策略
- Android中Bluetooth的意义和用法
- What Program Is Using Port 8080
- 跟着实例学习java多线程2-synchronized锁住的是对象还是代码