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

注意点:

在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 ViewController

static 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 *[email protected]"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 *[email protected]"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 *[email protected]"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 *[email protected]"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
时间: 2024-11-04 14:58:14

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

iOS开发系列-SQLite

概述 SQLite3是一款轻型的嵌入式数据库.它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库速度还快. 数据库简介 常见的数据库可以分为2大类 关系型数据库(主流) 对象型数据库 常用的关系型数据库 PC端:Oracle.MySQL.SQL Server.Access.DB2.Sybase 嵌入式\移动客户端: SQLite SQLite SQLite SQL语句 SQL (structured query lan

ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.

ios开发 上传到App Store 时出错. iTunes Store Operation Failed,    An Error occurred uploading to the iTunes store. 的解决方法,网上找了很多. 如下(当然没有解决我的问题,可以一试): 今天在提交app的时候,最后一步报错, An error occurred uploading to the iTunes Store! 后来上网查了查资料,在这里整理一下: 第一: 有可能是中文编码的问题,需要把编

iOS开发数据库SQLite的使用

iOS系统自带Core Data来进行持久化处理,而且Core Data可以使用图形化界面来创建对象,但是Core Data不是关系型数据库,对于Core Data来说比较擅长管理在设备上创建的数据持久化存储用户创建的对象,但是要处理大量的数据时就应该优先选择SQL关系型数据库来存储这些数据. Core Data在后台也是使用SQLite来存储数据的,但是开发人员不能直接访问这些数据,只能通过Core Data提供的API来操作,如果一旦人为的通过SQLite修改这些数据那么使用Core Dat

iOS开发系列—Objective-C之内存管理(前辈写的,借鉴了一下,超赞)

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

学习ios开发系列之,利用百度词典api写的ios客户端程序

先附上效果图: 还是很简单,主要用的storyboard,不过准备学习下cocoui来布局了,storyboard很逆天! 其他的就是http请求这块,还有NSString类使用了! 附上主要的源代码: NSString* queryword = word.text; NSString* urlStr = [[NSString alloc] initWithFormat:@"http://openapi.baidu.com/public/2.0/translate/dict/simple?cli

一个java程序员自学IOS开发之路(一)

首先自我介绍吧,南昌大学软件工程专业2015界毕业生,从大学牲变到程序猿,由于在学校里只学了Java语言和B/S架构开发,于是乎出来实习和工作也是搞Java网页开发. 但是作为一名果粉,现阶段想转IOS开发,最近也开始自学了,写点东西记下来吧 2015/9/17 Day 1 安装虚拟机并安装Mac OS X系统(苦逼的我还在用联想Y-470) 开始看C语言基础,由于大学里学过一点,还是比较轻松的 2015/9/19 Day 2 由于Java中没有指针,开始看指针的相关知识 2015/9/20 D

ios开发:如何用js调用ios

本文转载至 :http://blog.chinaunix.net/uid-29415710-id-4058564.html - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL * url = [request URL]; if ([[url sche

iOS开发:Toast for iPhone

iOS开发:Toast for iPhone 分享一个我写的类似于android的toast的提示框 主要特点: 1,支持屏幕Y轴任意位置显示,设置距离顶/底端距离 2,支持多行文本 3,支持设置等待时间 4,支持点击隐藏,屏幕旋转时自动隐藏,淡入淡出 5,无需初始化,类方法调用 效果图: 全部代码如下,使用时需要添加QuartzCore.framework,希望能给大家带来方便. #import <Foundation/Foundation.h> #define DEFAULT_DISPLA

iOS开发 GPS定位 指定语言 返回中文地点

在iOS开发中,用到定位时经常会遇到这个头疼的问题:系统语言为英文时返回英文或拼音,系统语言是中文时才返回中文. 下面是强制系统获取的定位地点为中文.方案是网上的,但优化了一下,当逆地理编码结束后才恢复系统语言,避免一些极端情况下的不生效问题. 实测可行.有问题欢迎留言. ` -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation: