我正在使用带有一个数据库和两个表的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。 (我通过检查返回值来验证这一点)。
我在这里做错了什么?
非常感谢提前!
答案 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