大家好
我在IOS中使用sqlite有一些问题。我从数据库中选择数据,然后我想将该数据保存在变量中。但是当我使用while(sqlite3_step(statement) == SQLITE_ROW)
循环时,代码永远不会执行。
这是我的代码:
-(void)retrieveProjectNameFromDb:(NSString *)segmenId{
NSString *query;
NSString *nameProjectStr;
NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"sqlite"];
if (sqlite3_open([dbPath UTF8String], &db) != SQLITE_OK) {
sqlite3_close(db);
NSAssert(0, @"Database failed to open.");
}else {
query = [NSString stringWithFormat:@"SELECT remote_projectname, remote_base_uri FROM REMOTE_SETTING WHERE remote_settingid = '%@' ORDER BY remote_projectname", segmenId];
NSLog(@"query : %@", query);
}
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil)==SQLITE_OK){
NSLog(@"sqlite row : %d", SQLITE_ROW);
NSLog(@"sqlite 3 : %d", sqlite3_step(statement));
while (sqlite3_step(statement) == SQLITE_ROW) {
char *nameProject = (char *)sqlite3_column_text(statement, 0);
if (nameProject == nil) {
NSLog(@"UNNAMED");
}else {
NSLog(@"else");
nameProjectStr = [NSString stringWithUTF8String:nameProject];
}
projectName.text = nameProjectStr;
nameProject = nil;
}
NSLog(@"project name : %@", projectName.text);
sqlite3_close(db);
}
}
当我的nslog值,sqlite3_step(语句)总是显示101而sqlite_row总是显示100.为什么会发生? 请问有人可以帮助我吗?
谢谢
此致
-risma -
答案 0 :(得分:5)
正如你所提到的,sqlite3_step(语句)总是显示101,这意味着sqlite3_step已经完成执行,因此这意味着你的sql查询没有从数据库返回任何行。我建议你首先检查数据库中是否存在REMOTE_SETTING表中存在的你所指的remote_settingid的记录。
供您参考,我从sqlite.org
获取了以下常量片段#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
答案 1 :(得分:3)
删除您拥有sqlite3_step()的NSLog条目。由于您的NSLog语句正在执行sqlite3_step(),因此该记录已在此处逐步执行。因此,您的while循环将不会执行,因为没有更多行要逐步执行。 我认为这肯定会对你有所帮助。 :)
答案 2 :(得分:0)
根据您对日志记录输出的描述,我猜您的查询返回一个空行集。但是我可以在这里看到另外两个问题:
sqlite3_step
的结果,因为您已将其记录,然后立即再次呼叫sqlite3_step
。这意味着你会错过第一行。尝试:
if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, nil)==SQLITE_OK){
NSLog(@"sqlite row : %d", SQLITE_ROW);
int stepResult = sqlite3_step(statement);
NSLog(@"sqlite 3 : %d", stepResult);
while (stepResult == SQLITE_ROW) {
char *nameProject = (char *)sqlite3_column_text(statement, 0);
if (nameProject == nil) {
NSLog(@"UNNAMED");
}else {
NSLog(@"else");
nameProjectStr = [NSString stringWithUTF8String:nameProject];
}
projectName.text = nameProjectStr;
nameProject = nil;
stepResult = sqlite3_step(statement);
}
NSLog(@"project name : %@", projectName.text);
sqlite3_finalize(&statement);
}
答案 3 :(得分:0)
尝试这样的事情......
sqlite3 *database1;
NSString *sqlStatement1 = @"";
if(sqlite3_open([databasePath UTF8String], &database1) == SQLITE_OK)
{
sqlStatement1 = [NSString stringWithString:@"SELECT uniqueid from shortlisted"];
sqlite3_stmt *compiledStatement1;
if(sqlite3_prepare_v2(database1, [sqlStatement1 cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStatement1, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement1) == SQLITE_ROW)
{
NSString * str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
}
}
sqlite3_finalize(compiledStatement1);
sqlite3_close(database1);
}
每当你打开它们时也会关闭数据库实例..如果你没有关闭一个实例那么可能会导致问题..
抱歉,我从我的项目中粘贴了这个...但实际上我有点着急...当我到家时,我会修改这个答案......