搜索数组保存在NSDictionary中

时间:2012-12-17 07:57:06

标签: objective-c ios nsdictionary

我有一个要求,我在NSDictionary中存储了5个密钥,对应于我存储了来自不同数组的5个值。我的数据结构如下:

字典是{

1 =     (
                {
            SubRegionName = "abc";
            WalkId = 123;
            WalkName = xyz;
        },
        {
        },....
2 =     (
                {
            SubRegionName = "abc";
            WalkId = 123;
            WalkName = xyz;
        },
        {
        },....
3 =     (
                {
            SubRegionName = "abc;
            WalkId = 123;
            WalkName = xyz;
        },
        {
        },....
4 =     (
                {
            SubRegionName = "abc";
            WalkId = 123;
            WalkName = xyz;
        },
        {
        },....
5 =     (
                {
            SubRegionName = "abc";
            WalkId = 123;
            WalkName = xyz;
        },
        {
        },
        )

我从sqlite获得的上述数据根据一些Id说tempId(1,2,3,4,5),我想单独使用它们。因为我必须在tableview中将walkName显示为cell.textlabel.text和SubregionName作为cell.detailtext.text。

我没有得到如何从字典中访问这些数据。任何人都可以建议我正确的方法。

我的代码是:

// 对于数据库查询(从数据库获取数据) ** * ** * ** * **

-(void)getMainRegions
{
    sqlite3 *walkNameDB;
    if (sqlite3_open([[self databasePath] UTF8String], &walkNameDB) != SQLITE_OK) {
        sqlite3_close(walkNameDB);
        NSAssert(0, @"Failed to open Walk name database");
    }



    NSString *regionQuery = @"SELECT Rid,RName from MainRegions";

    sqlite3_stmt *teststatement = nil;

   // NSLog(@"%d",sqlite3_prepare_v2(walkNameDB,[regionQuery UTF8String], -1, &teststatement, nil));

    if (sqlite3_prepare_v2(walkNameDB,[regionQuery UTF8String], -1, &teststatement, nil) == SQLITE_OK)
    {
        RNameArray = [[NSMutableArray alloc] init];
        RIdArray = [[NSMutableArray alloc] init];

        while( sqlite3_step(teststatement) == SQLITE_ROW )
        {

            NSNumber *RId;
            int temp1 = (int)sqlite3_column_int(teststatement, 0);
            RId = [[NSNumber alloc] initWithInt:temp1];

            char *RNameCharacter;
            RNameCharacter = (char *) sqlite3_column_text(teststatement, 1);
            NSString *RNameString = [[NSString alloc] initWithUTF8String:RNameCharacter];

            [RNameArray addObject:RNameString];
            [RIdArray addObject:RId];


        }

    }
    [self getWalks];
}

-(void)getWalks
{
    sqlite3 *walkNameDB;
    if (sqlite3_open([[self databasePath] UTF8String], &walkNameDB) != SQLITE_OK) {
        sqlite3_close(walkNameDB);
        NSAssert(0, @"Failed to open Walk name database");
    }

    RegionWalksDictionary = [[NSMutableDictionary alloc] init];

    for(regionId in RIdArray)
    {
        regionWalkArray = [[NSMutableArray alloc] init];
        NSString *walkQuery = [[NSString alloc] initWithFormat:@"SELECT Wid,WName,SName from Walks,SubRegions WHERE Walks.Sid=SubRegions.Sid AND Rid = %d",[regionId integerValue] ];

        sqlite3_stmt *walkstatement = nil;

     //   NSLog(@"%d",sqlite3_prepare_v2(walkNameDB,[walkQuery UTF8String], -1, &walkstatement, nil));

        if (sqlite3_prepare_v2(walkNameDB,[walkQuery UTF8String], -1, &walkstatement, nil) == SQLITE_OK)
        {
            while( sqlite3_step(walkstatement) == SQLITE_ROW )
            {
                NSNumber *WId;
                int temp1 = (int)sqlite3_column_int(walkstatement, 0);
                WId = [[NSNumber alloc] initWithInt:temp1];

                char *WNameCharacter;
                WNameCharacter = (char *) sqlite3_column_text(walkstatement, 1);
                NSString *WNameString = [[NSString alloc] initWithUTF8String:WNameCharacter];

                char *SNameCharacter;
                SNameCharacter = (char *) sqlite3_column_text(walkstatement, 2);
                NSString *SNameString = [[NSString alloc] initWithUTF8String:SNameCharacter];

                NSMutableDictionary *tempWalk = [[NSMutableDictionary alloc] init];
                [tempWalk setObject:WId forKey:@"WalkId"];
                [tempWalk setObject:WNameString forKey:@"WalkName"];
                [tempWalk setObject:SNameString forKey:@"SubRegionName"];
                [regionWalkArray addObject:tempWalk];
            }
        }


        [RegionWalksDictionary setObject:regionWalkArray forKey:regionId];
     //   NSLog(@"arr%@",RegionWalksDictionary);

    }

}

// * ** 从数据库获取数据的方法在此结束 * ** * ** * ** * ****

4 个答案:

答案 0 :(得分:0)

您的5个密钥似乎有一个NSDictionary,而您内部有一个NSArray,其中一个元素是NSDictionary。虽然我可能错了,试试这个:

NSDictionary *dictionaryForKey1 = [[myDictionary objectForKey:@"1"] objectAtIndex:0];

然后你可以使用它:

NSString *walkName = [dictionaryForKey1 objectForKey:@"WalkName"];

答案 1 :(得分:0)

试试这个

NSString * walkName = [[parentDic objectForKey:[NSString stringWithFormat:@"%d",indexPath.row]] objectForKey:@"WalkName"];
NSString * SubregionName = [[parentDic objectForKey:[NSString stringWithFormat:@"%d",indexPath.row]] objectForKey:@"SubRegionName"];

答案 2 :(得分:0)

试试这种方式......

for(id dict in RegionWalksDictionary){

        NSLog(@"WalkId: %@",[[[RegionWalksDictionary objectForKey:dict]objectAtIndex:0]objectForKey:@"WalkId"] );
        NSLog(@"WalkName: %@",[[[RegionWalksDictionary objectForKey:dict]objectAtIndex:0]objectForKey:@"WalkName"] );
        NSLog(@"SubRegionName: %@",[[[RegionWalksDictionary objectForKey:dict]objectAtIndex:0]objectForKey:@"SubRegionName"] );
        NSLog(@"----");

}

我使用如下(如果这不是结构或数据则注释)

NSMutableDictionary *RegionWalksDictionary=[NSMutableDictionary new];
NSMutableArray *regionWalkArray=[NSMutableArray new];
NSMutableDictionary *tempWalk=[NSMutableDictionary new];

[tempWalk setObject:@"wk1" forKey:@"WalkId"];
[tempWalk setObject:@"wkName1" forKey:@"WalkName"];
[tempWalk setObject:@"srName1" forKey:@"SubRegionName"];

[regionWalkArray addObject:tempWalk];

[RegionWalksDictionary setObject:regionWalkArray forKey:@"1"];
[RegionWalksDictionary setObject:regionWalkArray forKey:@"2"];
[RegionWalksDictionary setObject:regionWalkArray forKey:@"3"];

NSLog(@"tempWalkd dict is %@",RegionWalksDictionary);

答案 3 :(得分:0)

AH!现在我看到了 - 有5个长度为1的数组

NSArray *array1 = dict[@"1];
NSDictionary *details = array1[0];

//print each var
id WalkName = details[@"WalkName"];