我想生成一个NSDictonary,可以用来填充列表视图与我从SQL语句检索到的数据。当我去创建一个数组并添加它们时,它会为我的所有密钥添加数组,而不仅仅是当前密钥。我已经尝试了数组上的removeAllObjects,但由于某种原因销毁了我已经放入字典中的所有数据。从SQL语句生成NSDictionary
//open the database
if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
const char *sql = "select alphaID, word from words order by word";
sqlite3_stmt *selectStatement;
//prepare the select statement
int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL);
if(returnValue == SQLITE_OK)
{
NSMutableArray *NameArray = [[NSMutableArray alloc] init];
NSString *alphaTemp = [[NSString alloc] init];
//loop all the rows returned by the query.
while(sqlite3_step(selectStatement) == SQLITE_ROW)
{
NSString *currentAlpha = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 1)];
NSString *definitionName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 2)];
if (alphaTemp == nil){
alphaTemp = currentAlpha;
}
if ([alphaTemp isEqualToString:(NSString *)currentAlpha]) {
[NameArray addObject:definitionName];
}
else if (alphaTemp != (NSString *)currentAlpha) {
[self.words setObject:NameArray forKey:currentAlpha];
[NameArray removeAllObjects];
[NameArray addObject:definitionName];
}
}
}
上面的语句添加了所有“键”,但是然后删除所有键的所有数组元素。如果我取出removeAllKeys,它将为所有键添加所有数组元素。我不想要这个,我希望它为特定的键添加数组元素,然后移动到下一个键。
在我想要一个NSDictonary与A(阵列)的端
阿尔法(字符串)
苹果(字符串)
B(阵列)
贝塔(字符串)
球(字符串)
C(阵列)
代码(字符串)
...
这很有道理。谢谢。我发现修改一个可变数组放到字典中会影响其结果,但确实发生了什么是很奇怪的。 – 2010-04-20 13:16:16
问题是,将数组放入字典中实际上是将指向该数组(而不是数组的副本)的指针放入字典中,因此,您的原始代码对于字典中的每个条目都具有与该数组相同的指针。 – Isaac 2010-04-20 19:34:51
是的,并且描述了究竟发生了什么。倾销副本效果很好。这实际上适用于我的许多问题。我的最终应用程序将能够将数据从SQL DB,XML和.plists转储为可在应用程序中使用的“常用”字典格式。我将需要这种方法处理几次。 – 2010-04-21 14:53:16