如何从无序的NSDictionary获取有序值

时间:2012-02-22 06:01:31

标签: iphone sqlite ios4

我正在尝试从table中获取和显示内容。目前我正在运行查询并使用NSMutableDictionary存储这些id和类别名称,这样可以正常工作。

但是当我将内容存储到NSMutableDictionary中时,我遇到了一个问题,即订单被更改。当搜索此问题时,似乎这是NSMutableDictionary的默认行为。

我不确定以及如何使用以及存储密钥对值的用途。

请告诉我如何克服这个问题

感谢您停止......

//====================================================================
- ( NSMutableDictionary * ) getDataToDisplayTierOne:(NSString*)dbPath{
//====================================================================

    NSMutableDictionary *aTierOneTemplateData = [[NSMutableDictionary alloc]init];

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    {
        const char *sql_query_stmt = "select * from main_categories";

        sqlite3_stmt *selectstmt;

        if(sqlite3_prepare_v2(database, sql_query_stmt, -1, &selectstmt, NULL) == SQLITE_OK) 
        {           
            while(sqlite3_step(selectstmt) == SQLITE_ROW) 
            {   
                NSString *aValue = [[NSString alloc] initWithUTF8String:
                                    (const char *) sqlite3_column_text(selectstmt, 1)];

                NSString *aId = [[NSString alloc] initWithUTF8String:
                                 (const char *) sqlite3_column_text(selectstmt, 0)];


                [aTierOneTemplateData setObject:aId forKey:aValue];

                [aValue release];
                [aId release];
            }
        }

        sqlite3_finalize(selectstmt);    
    }   
    sqlite3_close(database); 

    return aTierOneTemplateData;

}
  

注意: - 我理解使用nsmutabledictionery的限制   所以我期待你的建议,我怎样才能克服/获取id,   其他方面的价值。请建议

更新了

例如

Apple 1 橙色2 木瓜3

其实我希望该列表在我的uitableview上显示

苹果 橙子 木瓜

点击每个单元格时,我想拥有其id值 例如,我点击Orange,现在我希望将id值设为2

你能告诉我如何迭代一系列dictionery

2 个答案:

答案 0 :(得分:1)

NSDictionary和NSSet都不是有序集合。如果您想订购,请使用NSArray。如果要强制排序,请将对象添加到具有自己的索引属性的无序集合中。

答案 1 :(得分:1)

使用NSMutableArray代替NSMutableDictionary

更改声明

NSMutableDictionary *aTierOneTemplateData = [[NSMutableDictionary alloc]init];

NSMutableArray *aTierOneTemplateList = [[NSMutableArray alloc]init];

将abjects添加到数组中,

[aTierOneTemplateList addObject:aId];

并返回NSMutableArray,

return aTierOneTemplateList;

修改

如果您按如下方式修改while循环,您将获得具有相同顺序的NSDictionary数组。

NSString *aValue = [[NSString alloc] initWithUTF8String:
                    (const char *) sqlite3_column_text(selectstmt, 1)];

NSString *aId = [[NSString alloc] initWithUTF8String:
                 (const char *) sqlite3_column_text(selectstmt, 0)];

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:aValue,@"value",aId,@"key", nil];
[aTierOneTemplateList addObject:dict];
[dict release];
[aValue release];
[aId release];

<强> EDIT2:

现在考虑在tableviewcontroller中,你有NSDictionary的数组(比如aTierOneTemplateList)。

cellForRowAtIndexPath方法中,

NSDictionary *dict = [aTierOneTemplateList objectAtIndex:indexPath.row];
NSString *key = [dict objectForKey:@"key"];
NSString *value = [dict objectForKey:@"value"];

同样在didSelectRowAtIndexPath方法中。