问题描述
|
我有一个方法,该方法从数据库生成返回值的字典:
- (NSDictionary *)getParametersForPreset:(NSUInteger)presetID plants:(NSArray *)plants
{
Nsstring *loggers = @\"\";
Nsstring *invertors = @\"\";
Nsstring *plantsList = @\"\";
const char *sql = \"SELECT loggerID,invertorID FROM records WHERE presetID IN (?) AND plantID IN (?)\";
BOOL isEmpty = YES;
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database,sql,-1,&statement,NULL) != sqlITE_OK)
{
NSLog(@\"Error: \'%s\'.\",sqlite3_errmsg(database));
}
for (int i = 0; i < [plants count]; i++) {
if (i == 0)
{
plantsList = [Nsstring stringWithFormat:@\"\'%@\'\",[[plants objectAtIndex:0] valueForKey:@\"id\"]];
}
else
{
plantsList = [plantsList stringByAppendingFormat:@\",\'%@\'\",[[plants objectAtIndex:i] valueForKey:@\"id\"]];
}
}
NSLog(@\"plants: %@\",plantsList);
NSLog(@\"preset: %d\",presetID);
sqlite3_bind_int(statement,1,presetID);
sqlite3_bind_text(statement,2,[plantsList UTF8String],sqlITE_TRANSIENT);
NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
int i = 0;
while (sqlite3_step(statement) == sqlITE_ROW)
{
if (i == 0)
{
loggers = [Nsstring stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];
invertors = [Nsstring stringWithUTF8String:(char *)sqlite3_column_text(statement,1)];
isEmpty = NO;
i++;
}
else
{
loggers = [loggers stringByAppendingFormat:@\",%@\",[Nsstring stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]];
invertors = [invertors stringByAppendingFormat:@\",1)]];
}
}
sqlite3_reset(statement);
if (isEmpty == YES)
{
return nil;
}
[dictionary setValue:[Nsstring stringWithString:[plantsList stringByReplacingOccurrencesOfString:@\"\'\" withString:@\"\"]] forKey:@\"plants\"];
[dictionary setValue:loggers forKey:@\"loggers\"];
[dictionary setValue:invertors forKey:@\"invertors\"];
return dictionary;
}
该查询在代码中没有返回任何内容,但是随后我在Firefox的sqlite Manager中针对相同的数据库执行了相同的查询,它为我返回了正确的数据。拜托,帮我找出我的错误,我真的已经筋疲力尽了。
这是我在Manager中执行的查询:
SELECT loggerID,invertorID FROM records WHERE presetID=1 AND plantID IN (\'3\',\'2\',\'1\',\'6\',\'5\',\'4\')
这是代码的记录值:
preset: 1
plants: \'3\',\'4\'
非常感谢!
解决方法
我最近一直在研究类似的查询。
我有一个NSMutableArray,它存储ID的列表。我使用componentsJoinedByString函数将它们作为字符串加入。
然后,我有一个使用StringWithFormat函数保存SQL语句的NSString对象。
因此,用于生成SQLite查询的代码可能类似于:
NSString * query = [NSString stringWithFormat:@\"SELECT loggerID,invertorID FROM records WHERE presetID IN (%d) AND plantID IN (%@)\",presetID,[plantsList componentsJoinedByString:@\",\"]];
希望这可以帮助。