Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 而(sqlite3_步骤(语句)==SQLITE_行)循环不工作_Ios_Iphone_Objective C_Sqlite - Fatal编程技术网

Ios 而(sqlite3_步骤(语句)==SQLITE_行)循环不工作

Ios 而(sqlite3_步骤(语句)==SQLITE_行)循环不工作,ios,iphone,objective-c,sqlite,Ios,Iphone,Objective C,Sqlite,我已经调试了代码,但不知道为什么While语句没有执行。在放置NSlog后,我知道它与结果不匹配。101和SQLITE_行等于100 但查询有结果。若我从表名中提取Select*,它将返回我的结果并执行while语句。如果我得到结果 sql_stmt = [NSString stringWithFormat:@"SELECT * FROM DeviceType WHERE upper(TypeName) = upper('%@')", deviceType]; While语句永远不会执行,请帮

我已经调试了代码,但不知道为什么While语句没有执行。在放置NSlog后,我知道它与结果不匹配。101和SQLITE_行等于100

但查询有结果。若我从表名中提取Select*,它将返回我的结果并执行while语句。如果我得到结果

sql_stmt = [NSString stringWithFormat:@"SELECT * FROM DeviceType WHERE upper(TypeName) = upper('%@')", deviceType];
While语句永远不会执行,请帮助。不知道问题出在哪里

代码如下:

NSArray* paths  =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

NSString* documentsDirectory = [paths objectAtIndex:0];

NSString* path = [documentsDirectory stringByAppendingPathComponent:@"ClientDB.sqlite"];

NSString* sql_stmt = [self searchStringForLocalData];

BOOL found = NO;

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
    const char* sql1 =  [sql_stmt UTF8String]; 

    sqlite3_stmt *statement;

    NSNumber *typeCount;

    typeCount = 0;

    if (sqlite3_prepare_v2(database, sql1, -1, &statement, NULL) == SQLITE_OK)
    {

        NSLog(@" %d, %d ",sqlite3_step(statement),SQLITE_ROW);

        while (sqlite3_step(statement) == SQLITE_ROW)   {

            // The second parameter indicates the column index into the result set.
            int primaryKey1 = sqlite3_column_int(statement, 0);


    NSNumber *typeId = [[NSNumber alloc] initWithInt:primaryKey1];

NSString *typeName =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

            NSString* sql_stmt1 = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Devices WHERE DeviceTypeId =%d",primaryKey1];


            const char *sql1 =  [sql_stmt1 UTF8String];

            sqlite3_stmt *statement;

            NSNumber *typeCount;

            typeCount = 0;

尝试使用以下语法

while(sqlite3_step(stmt)!=SQLITE_DONE)
{
     //do ur processing
   for(i=0;i<NO_OF_COLS;i++)
   {
    char * tmp1=sqlite3_column_text(stmt,i);
        if(tmp1!=NULL)
        {
            //use the value
        }
        else
        {
            //use a default
        }
   }
}
while(sqlite3\u步骤(stmt)!=SQLITE\u完成)
{
//你做什么

对于(i=0;i,如注释中所述,代码为
NSLog
调用
sqlite3\u步骤一次,然后在
while
循环的情况下调用第二次。 如果您的查询只返回一条记录,则第一个
sqlite3\u步骤
调用将跳转到该记录,然后第二个
sqlite3\u步骤
调用将(正确地)报告没有进一步的结果可用

只需删除该
NSLog
调用

或者,只调用一次
sqlite3\u step
,并对日志记录和循环使用相同的返回值:

int rc;
...
while (1) {
    rc = sqlite3_step(statement);
    NSLog(@" %d, %d ", rc, SQLITE_ROW);
    if (rc != SQLITE_ROW)
        break;
    ...
}
if (rc != SQLITE_DONE)
    NSLog(@"error: %s", sqlite3_errmsg(database));

这表明您的表是完全空的。您可能需要检查insert是否正常工作。如果您使用
sqlite3\u prepare\u v2
准备带有一些
标记的语句,请记住执行查询。如下所示:

if(sqlite3_step(stmt) == SQLITE_DONE) NSLog(@"INSERTED");
else NSLog(@"NO INSERTED");

注意:仅当您的查询错误时,它才会显示错误,但不会显示您准备的语句是否已执行。

我已经尝试过这种方法。它允许在while循环中输入内部。但当代码尝试获取第一行的结果时,它会使应用程序崩溃,并显示由于未捕获的异常“NSInvalidArgu”,行终止应用程序中没有任何内容mentException',reason:'***+[NSString stringWithUTF8String:]:NULL cString'***第一次抛出调用堆栈:如果表中的列为NULL,sqlite3 api将返回NULL指针,因此请尝试添加一个复选框,说明sqlite3_column_text(stmt,i)!=nullI已更改此语句sql\u stmt=[NSString stringWithFormat:@“从DeviceType WHERE upper(TypeName)中选择*”=上限('%@'),deviceType];到sql_stmt=[NSString stringWithFormat:@“从deviceType中选择计数(*),其中上限(TypeName)=上限('%@')”,deviceType]现在正在打印NSLog(100100),但我想知道它现在是否匹配。但它仍然不会进入循环,执行计数(*)时有任何想法吗query返回单独返回的行数。没有数据,因此它将从循环中出来。这是预期的行为。请尝试null检查是否为null。但当我执行此语句时,const char*sql=“SELECT*FROM DeviceType ORDER BY lower(TypeName)”;它返回给我7个结果,sqlite3_步骤返回的代码是什么,sqlite3_errmsg报告了什么?那么,sqlite3_步骤返回的代码是什么,sqlite3_errmsg报告了什么???-1,因为您没有在错误上记录sqlite3_errmsg。