我调试了代码,但不知道为什么While语句没有执行。在放置NSlog之后我才知道它与结果不匹配。 101和SQLITE_ROW等于100.
但查询有结果。如果我从表名中获取Select *,则返回结果并执行while语句。如果我获取结果
sql_stmt = [NSString stringWithFormat:@"SELECT * FROM DeviceType WHERE upper(TypeName) = upper('%@')", deviceType];
虽然声明从未执行,所以请帮忙。不知道问题出在哪里。
以下是代码:
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;
答案 0 :(得分:0)
正如评论中已经提到的,代码为sqlite3_step
调用NSLog
一次,然后在while
循环的条件下调用第二次。
如果您的查询只返回一条记录,则第一个sqlite3_step
调用将转到该记录,然后第二个sqlite3_step
调用将(正确地)报告没有其他结果可用。
只需删除NSLog
电话。
或者,只调用sqlite3_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));
答案 1 :(得分:-1)
尝试使用以下语法
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
}
}
}
答案 2 :(得分:-1)
它表明你的桌子是完全空的。您可能需要检查插件是否正常工作。如果您使用sqlite3_prepare_v2
准备带有?
个标记的语句,请记住执行查询。就像这样:
if(sqlite3_step(stmt) == SQLITE_DONE) NSLog(@"INSERTED");
else NSLog(@"NO INSERTED");
注意:只有在您的查询错误时才显示错误,但不会执行您准备好的语句。