【发布时间】:2014-05-24 23:42:00
【问题描述】:
所以我是 iOS 开发的新手,我的选择功能有问题。我做了一个函数,应该接受一个选择查询和表名,并返回一个结果数组,其中每个数组条目都是一个带有一行结果的字典。不知何故,我对列名的查询正在删除我的 columnNames 变量并返回疯狂的结果。我只是想找出一种简单的方法来存储、访问、操作查询结果
这是将结果转换为数组的函数:
-(NSMutableArray *)selectQuery:(NSString*)query
table:(NSString*)table
{
NSMutableArray *returnArray = [NSMutableArray new];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
NSMutableArray *columnNames;
NSString *tableQuery = [NSString stringWithFormat:@"PRAGMA table_info('%@')", table];
if (sqlite3_prepare_v2(database, [tableQuery UTF8String], -1, &statement, nil) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
[columnNames addObject:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)]];
}
}
else
{
NSLog(@"Error preparing table query:");
NSLog(tableQuery);
}
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
{
while(sqlite3_step(statement)==SQLITE_ROW)
{
NSMutableDictionary *temp= [NSMutableDictionary new];
for (int i = 0; i < [columnNames count]; i++)
{
[temp setObject:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, i)] forKey:columnNames[i]];
}
if (temp != nil)
{
[returnArray addObject:temp];
temp = nil;
}
}
sqlite3_reset(statement);
sqlite3_close(database);
}
else
{
NSLog(@"Error preparing select statement with query:");
NSLog(query);
}
}
else
{
NSLog(@"Could not open database");
}
return returnArray;
}
这是对它的调用
NSMutableArray *queryResults = [dbInstance selectQuery:[NSString stringWithFormat:@"SELECT gallons, mileage FROM fillups WHERE carId = \"%d\" ORDER BY date asc",
carId]
table:@"fillups"];
【问题讨论】:
-
“不知何故,我对列名的查询正在删除我的 columnNames 变量并返回疯狂的结果”你的证据是什么? 实际上发生了什么?描述事实,而不是你已经形成的结论......
-
顺便说一句,如果您不想这样做,则不必拨打
pragma table_info电话。有 SQLite 函数调用可从您的 select 语句中返回列名(例如,sqlite3_column_count获取列数,sqlite3_column_name获取列名)。这样,您将自动从 SQL 语句中检索列的名称,而不是从表定义中检索(并且您不必调用PRAGMA table_info)。 -
matt,这就是我从调试器跟踪它时实际发生的事情。这不是基于我形成的任意点的疯狂结论。希望对 cmets 投反对票。
-
Rob,非常感谢您对此进行调查。你给我的所有信息真的很有帮助。生病马上改变它,让你知道它是如何工作的:)
-
@bia.migueis 另外,您的所有列都是
TEXT值吗?如果没有,您可能希望在sqlite3_column_type的基础上创建适当的对象类型。
标签: ios sqlite cocoa-touch ios7 nsmutablearray