精华内容
下载资源
问答
  • 【iOS开发-104】SQLite使用:注意查询时分步写会出现死循环

    (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 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 *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失败");
        }
    }


    展开全文
  • while中使用continue出现死循环的情况 下面就是continue在while中使用出现死循环的情况: //求100以内的含7的数字 int i = 1; while(i < 100) { if(i /10 == 7||i %10 == 7 || i % 7 ==0) { continue; ...

    while中使用continue出现死循环的情况

    下面就是continue在while中使用出现死循环的情况:

    	//求100以内的含7的数字
    	int i = 1;
    	while(i < 100) {
    		if(i /10 == 7||i %10 == 7 || i % 7 ==0) {
    			continue;
    		}
    		i++;
    		System.out.println(i);
    		
    	}
    

    解决方法:

    将 i++ 添加到 if 之前

    		//求100以内的含7的数字
    		int i = 0;
    		while(i < 100) {
    			i++;
    			if(i /10 == 7||i %10 == 7 || i % 7 ==0) {
    				continue;
    			}
    			System.out.println(i);
    			
    		}
    
    展开全文
  • 很多时候使用如下模式写代码,直接使用cin,会出现两种问题: 1、 当我们输入英文字母’b’时,它的状态标识改为fail,这个状态标识没有清除,进入死循环。 2、输入ctrl+c等信号,cin将不会等待输入,进入死循环。...
    很多时候会使用如下模式写代码,直接使用cin,会出现两种问题:
    

    1、 当我们输入英文字母’b’时,它的状态标识改为fail,这个状态标识没有清除,进入死循环。
    2、输入ctrl+c等信号,cin将不会等待输入,进入死循环。

    #include <iostream> 
    using namespace std; 
    int main()  
    {                 
        while(1)         
        {    
            cout << "test" << endl;
            int a;              
            cin >> a;                 
            if(cin.fail())                           
            {                         
                cout<<"输入有错!请重新输入"<<endl;                               
            }                 
            else                 
            {                         
                cout<<a;                         
                break;                 
            }         
        }         
        return 0; 
    }

    所以使用cin之前可加以下两个函数,避免出现莫名其妙的问题。
    cin.clear(); //更改状态标识符
    cin.sync(); //清空缓存区的数据流

    展开全文
  • 子线程死循环里加休眠,跳出死循环,执行while后面的语句? 子线程死循环里加打印,跳出死循环,执行while后面的语句? 问题代码: package com.demo; import java.util.concurrent.TimeUnit; /**...

    问题描述:

    • 子线程死循环里加休眠,会跳出死循环,执行while后面的语句?
    • 子线程死循环里加打印,会跳出死循环,执行while后面的语句?

     

    问题代码:

    package com.demo;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Description
     * @Author by mocar小师兄
     * @Date 2020/3/13 16:54
     **/
    public class Voletile_Thread {
        private static boolean Flag=false;
        private static int count=0;
    
        public static void main(String[] args) throws InterruptedException {
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "开始执行任务");
                    while (!Flag) {
                        //子线程死循环里加休眠,会跳出死循环,执行while后面的语句?
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        count++;
                        //子线程死循环里加打印,会跳出死循环,执行while后面的语句?
                        System.out.println("count:\t" + count);
                    }
                    System.out.println( Thread.currentThread().getName() +"执行结束");
                }
            });
            thread1.start();
            System.out.println("Main主线程等待1秒");
            Thread.sleep(200);
            Flag=true;
            System.out.println("Main主线程修改了Flag值,主线程结束");
    
        }
    }
    

     

     

     

     

    当注释掉休眠和打印的语句,子线程可以正常死循环!

    package com.demo;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Description
     * @Author by mocar小师兄
     * @Date 2020/3/13 16:54
     **/
    public class Voletile_Thread {
        private static boolean Flag=false;
        private static int count=0;
    
        public static void main(String[] args) throws InterruptedException {
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "开始执行任务");
                    while (!Flag) {
                        //子线程死循环里加休眠,会跳出死循环,执行while后面的语句?
                        /*try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }*/
                        count++;
                        //子线程死循环里加打印,会跳出死循环,执行while后面的语句?
                        //System.out.println("count:\t" + count);
                    }
                    System.out.println( Thread.currentThread().getName() +"执行结束");
                }
            });
            thread1.start();
            System.out.println("Main主线程等待1秒");
            Thread.sleep(200);
            Flag=true;
            System.out.println("Main主线程修改了Flag值,主线程结束");
    
        }
    }
    

     

     

    解释:

    为什么子线程死循环里加打印/休眠,会跳出死循环?

    1、先说下多线程下的内存模型

    对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。

     

    2、

    先解释正常情况下,子线程中不加 sleep 和  System.out.println("count:\t" + count),如下:

            一开始主线程中的Flag的变量值为false,创建了一个子线程Thread-0,将Flag复制到运行内存中,因为Thread-0在运行的时候Flag一直都是false,因此while循环会一直运行。虽然后面主线程休眠了一小会后,改变了主内存里面Flag为true了,但是影响不了Thread-0运行内存中的Flag的值。因此Thread-0会一直在while中无限循环。

            现在加了println后,因为println操作是Synchronized加锁的,它会做以下的操作:

    • 1、获得同步锁;
    • 2、清空工作流出来;
    • 3、从主内存拷贝对象副本到线程工作内存中;
    • 4、开始继续执行代码
    • 5、刷新主内存数据
    • 6、释放同步锁。

    System.out.println源码如下:

    在清空内存刷新内存的过程中,Thread-0线程有这么一个操作:获取锁到释放锁。Thread-0线程的Flag就变成了true(从主内存拷贝对象副本到线程工作内存中),所以就跳出了循环。指令重排序的情况也就不会出现了,这也是Volatile关键字的两种特性之一。

    子线程中加休眠也是一个道理,调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放。当锁释放后,又会从从主内存拷贝对象副本到线程工作内存中。

     

     

     

    展开全文
  • HashMap进行put操作引起死循环

    千次阅读 2020-07-03 13:22:33
    HashMap进行put操作引起死循环? 最近在磕《java并发编程艺术》,在看到第六章的时候出现了下面这段我不是很理解的东西,如下 《java并发编程艺术》截取 为什么要使用ConcurrentHashMap 在并发编程中使用HashMap...
  • HashMap 是非线程安全的,在多线程处理场景下,严禁使用。...因为在高并发情况下,HashMap在一些操作上存在问题,如死循环问题,导致CPU使用率较高。 下面来看下怎么复现这个问题。如下代码所示,我们创建10...
  • HashMap并发导致死循环

    千次阅读 2019-03-14 09:39:40
    为何出现死循环简要说明  HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%。  HashMap采用链表解决Hash冲突。因为是链表结构,那么就很...
  • ) //第一次for循环i=1。第二次循环i=2 { switch(i%3) { case 0:k++; case 1:k++;break; //case2跳出switch循环 case 2:k++;continue; //case2继续switch循环 } i+=1; //i自增为2 } printf("%d\...
  • while死循环

    千次阅读 2016-05-07 22:24:12
    用while来实现,我出现以下死循环: >>> sum = 0 >>> for i in range(1,101): while i%2 != 0: sum += i #死了……因为while条件永远满足 然后我灵机一动: >>> sum = 0 >>> for i in r
  • 当遇到Win10系统无法启动,开机后又自动重启这样往复的重启另人崩溃,这就是win10开机死循环重启了,那么这时用户该如何解决呢?下面我们就来看看当我们遇上这样的问题时该如何解决。以下小编使用手动修复和重置...
  • 死循环的调试

    2018-08-28 22:12:48
    ②当真的判断不出来哪里出现错误的时候此时可以使用输出语句输出相关的值查看相关情况来进行进一步的判断,但是往往出现死循环的时候往往在控制台打印的时候打印出来的数字是跳跃的,无法观看,此时需要定义一个变量...
  • HashMap在jdk1.8中也会死循环

    万次阅读 2019-03-03 18:43:19
    jdk1.7版本中多线程同时对HashMap扩容时,引起链表死循环,尽管jdk1.8修复了该问题,但是同样在jdk1.8版本中多线程操作hashMap时仍然引起死循环,只是原因不一样。 示例代码 package com.gsonkeno.interview; ...
  • 目录 一、初步诊断: 1、死循环: 2、死锁: 二、进一步定位分析: ...如果主线程出现死循环,那么windows将不能从消息队列中取出消息,并进行处理,所以出现卡死现象。为了验证是这个原因导致
  • 嵌入式死循环

    千次阅读 2013-10-31 11:53:22
    1. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达...
  • 排查线上死循环

    千次阅读 2017-01-21 22:38:21
    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现死循环。 (友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen) 以我们最近出现的一个实际...
  • 关于fscanf乱码和死循环的解决方法

    千次阅读 2019-07-18 11:51:07
    2.出现死循环的情况。 以下为解决方法: 首先,数据乱码的问题,目前发现2种情况: 1.fscanf函数参数2的格式与文本不符,主要出现在中英文符号的问题上。 2.代码编码和txt文本的编码不符。 代码我用的是ANSI,但是不...
  • HashMap并发导致死循环 CurrentHashMap

    千次阅读 2018-02-05 20:02:46
    为何出现死循环简要说明 HashMap闭环的详细原因 cocurrentHashMap的底层机制   为何出现死循环简要说明  HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get...
  • Linxu 进程死循环问题调试

    千次阅读 2017-07-01 10:16:20
    inux下,多线程程序死循环问题调试 ... 假设程序某处存在潜在的死循环,并在某种条件下会引发,本文以一个示例来定位出现死循环的位置。 当程序某处存在死循环,通常定位问题及缩小范围的方法是,在可疑的代码处加l
  • 本人在项目开发中碰到这样的情况:若哪位高手知道解决方法,请给点... 现在有个功能是要导出excel文件,我使用了以下的请求径: [list] 1.[code]导出xls[/code] 2.[code] function doExcel(){ doc...
  • 多线程下的HashMap死循环问题详解

    千次阅读 2020-10-21 18:03:29
    小伙伴们大家好呀,今天看技术博文的时候看到一个很有意思的问题,就如标题所示------》在多线程的情况下关于HashMap的死循环问题,还记我在刚学JavaSE时候,看到过这个问题,当时的知识储备不够,没有深究,今天来...
  • 快速查找Unity死循环

    千次阅读 2016-06-24 18:52:59
    我们先建立一个新工程,新建C#文件,然后在Start函数中加入以下代码:void Start () { while (true) { int i = 1; } }把这个C#文件挂到场景摄像机或其它GameObject上。打开这个工程对应的VS工程(如何用VS编辑...
  • 在.svn目录下打开命令行输入以下语句: sqlite3 wc.db 点击回车  delete from work_queue; 点击回车  delete from wc_lock; 点击回车 4.然后在文件夹右键Tortoisesvn,点击clean up 就可以了 ...
  • 我故意写了个死循环

    2018-11-22 22:45:53
    导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是其中一个没踩过的。人生似乎有些不完整。 所以,我做了一个很重要的决定:在程序中写一个死循环。...
  • 什么是网站内链死循环

    千次阅读 2012-06-23 12:27:08
    不论是动态网站还是静态网站,提高“网站链接对搜索引擎的友好性”至关重要。... 2、忌“死循环链接”;它把“蜘蛛触角”卡在那里,白白耗费“蜘蛛体力”,这是“蜘蛛”最郁闷的事情。几乎所有的搜索引擎
  • 在编程中,各种各样的数据需要处理,避免不了使用各种循环,在使用循环时如果使用不恰当就变成死循环,就比如while循环 循环就是把所选数据中的每一条数据遍历一次 如以下例子中, 我先是声明了一个变量i ,并...
  • 检测Lua脚本中死循环及解决方法

    千次阅读 2018-08-30 17:02:50
    检测Lua脚本中死循环及...不过脚本通常是用户编写的,很有可能出现死循环,虽说这是用户的问题,但却造成我们的宿主程序死掉。所以检测用户脚本中的死循环并中止这段脚本的运行就显得非常重要了。 可是,一个现...
  • package ... /* * 需求:使用while循环, 输出10次HelloWorld.请在跳过第4次输出. * */public class While_Continue {public static void main(String[] args) { int i = 1; while (i <= 10)
  • 近段时间遇到Ubuntu系统关机总是卡死或者出现5个点一直死循环的问题,在网上查了很多资料,试了很多方法,都不管用,今天终于解决了,特地记录一下,希望给有相似问题的朋友提供帮助~~~ 采用shell命令行(sudo ...
  • 一旦碰到这样的情况,就是页面一直卡在那里,对应着后台就是,要么程序死循环,要么数据库死循环,直到系统卡死崩溃。 这个问题很是头疼,在网上找了不少资料没有发现真正能够解决我的问题的,究其原因,还是...
  • 不会再有比这篇更易懂的HashMap扩容死循环

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,225
精华内容 40,090
关键字:

以下会出现死循环的是