XCode sqlite3 - SELECT总是返回SQLITE_DONE

时间:2011-01-13 03:40:59

标签: iphone xcode sqlite

在一天的头撞之后,一个菜鸟在这里寻求帮助....

我正在使用带有一个数据库和两个表的sqlite3数据库的应用程序。我现在已经到了一个步骤,我想从带有参数的表中进行选择。代码在这里:

-(NSMutableArray*) getGroupsPeopleWhoseGroupName:(NSString*)gn;{

 NSMutableArray *groupedPeopleArray = [[NSMutableArray alloc] init];

 const char *sql = "SELECT * FROM Contacts WHERE groupName='?'";

 @try { 
     NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);  
     NSString *docsDir = [paths objectAtIndex:0];  
     NSString *theDBPath = [docsDir stringByAppendingPathComponent:@"ContactBook.sqlite"];

     if (!(sqlite3_open([theDBPath UTF8String], &database) == SQLITE_OK))
     { NSLog(@"An error opening database."); }

     sqlite3_stmt *st;
     NSLog(@"debug004 - sqlite3_stmt success.");   

     if (sqlite3_prepare_v2(database, sql, -1, &st, NULL) != SQLITE_OK)
     { NSLog(@"Error, failed to prepare statement."); }

     //DB is ready for accessing, now start getting all the info.
     while (sqlite3_step(st) == SQLITE_ROW)
     {   

        MyContacts * aContact = [[MyContacts alloc] init];

        //get contactID from DB.
        aContact.contactID = sqlite3_column_int(st, 0);

        if (sqlite3_column_text(st, 1) != NULL)
        { aContact.firstName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(st, 1)]; }
        else { aContact.firstName = @""; }

        // here retrieve other columns data ....

       //store these info retrieved into the newly created array.
       [groupedPeopleArray addObject:aContact];

       [aContact release];

    }

    if(sqlite3_finalize(st) != SQLITE_OK)
    { NSLog(@"Failed to finalize data statement."); }

    if (sqlite3_close(database) != SQLITE_OK)
    { NSLog(@"Failed to close database."); }

    }

 @catch (NSException *e) {
 NSLog(@"An exception occurred: %@", [e reason]);
 return nil;  }

 return groupedPeopleArray;}

MyContacts是我放置所有记录变量的类。

我的问题是sqlite3_step(st)总是返回SQLITE_DONE,所以我永远不能得到myContacts。 (我通过检查返回值来验证这一点)。

我在这里做错了什么?

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

我认为你没有约束价值,如果不使用这个

sqlite3_bind_text(stmt, 1, [groupName UTF8String], -1, SQLITE_STATIC);

答案 1 :(得分:1)

你没有约束你的陈述。

你真的在执行SELECT * FROM Contacts WHERE groupName ='?'原样。

这可能会返回一个空集,这就是sqlite3_step返回SQLITE_DONE的原因,集合中没有任何内容可读,你就完成了。

This page有一个将参数绑定到语句的示例..

编辑:此外,你不需要引号?

  

SELECT * FROM Contacts WHERE   组名=?

然后使用sqlite3_bind_text