2010-04-14 91 views
0

我想生成一个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(阵列)
代码(字符串)
...

回答

2

虽然我不认为这会影响你的问题,从我看了你的代码的方式,你应该改变

NSString *alphaTemp = [[NSString alloc] init]; 

NSString *alphaTemp = nil; 

因为alphaTemp只是用来指向一个NSString是最初生成为currentAlpha。您也应该在您提供的代码下面的某个点拨打[NameArray release],因为您的号码是alloc

真正的问题是,你反复添加指针指向相同NSMutableArrayNSDictionaryself.words)。我可以看到两种方法来解决这个问题:

变化

[self.words setObject:NameArray forKey:currentAlpha]; 

[self.words setObject:[NSArray arrayWithArray:NameArray] forKey:currentAlpha]; 

所以要添加新创建(非可变)NSArrayNSDictionary

- -

插入

[NameArray release]; 
NameArray = [[NSMutableArray alloc] init]; 

[self.words setObject:NameArray forKey:currentAlpha]; 

,这样一旦你插入NSMutableArrayNSDictionary,创建一个新的NSMutableArray下一步。

+0

这很有道理。谢谢。我发现修改一个可变数组放到字典中会影响其结果,但确实发生了什么是很奇怪的。 – 2010-04-20 13:16:16

+0

问题是,将数组放入字典中实际上是将指向该数组(而不是数组的副本)的指针放入字典中,因此,您的原始代码对于字典中的每个条目都具有与该数组相同的指针。 – Isaac 2010-04-20 19:34:51

+0

是的,并且描述了究竟发生了什么。倾销副本效果很好。这实际上适用于我的许多问题。我的最终应用程序将能够将数据从SQL DB,XML和.plists转储为可在应用程序中使用的“常用”字典格式。我将需要这种方法处理几次。 – 2010-04-21 14:53:16