2

我使用 FQL 查询来一次检索好友列表:

-(void)fetchSaveUserFriendDetails
{
 NSString* query = [NSString stringWithFormat:@"SELECT uid,name,birthday_date FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())"];

 // Set up the query parameter
  NSDictionary *queryParam = [NSDictionary dictionaryWithObjectsAndKeys:
                                    query, @"q", nil];
 // Make the API request that uses FQL
  [FBRequestConnection startWithGraphPath:@"/fql"
                                     parameters:queryParam
                                     HTTPMethod:@"GET"
                              completionHandler:^(FBRequestConnection *connection,
                                                  id result,
                                                  NSError *error) {
    if (!error)
    {
       NSLog(@"result is %@",result);

       NSArray *resultData = [result objectForKey:@"data"];
       if ([resultData count] > 0) {
       for (NSUInteger i=0; i<[resultData count] ; i++) {
          [self.friendsDetailsArray addObject:[resultData objectAtIndex:i]];
             NSLog(@"friend details are %@",friendsDetailsArray);
     }
   }
 }

        }];
 //Save friends to database stuff
 ..................
}

我得到以下输出:

在此处输入图像描述

我已经浏览了Facebook Developers FQL 查询的官方文档,但我无法找出如何解析数据。

我尝试了以下方法来解析检索到的数据:

NSString *jsonString = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
NSDictionary *jsonValue = [jsonString JSONValue];
NSArray *values = [jsonValue objectForKey:@"friendinfo"];

其中结果以 JSON 格式保存所有朋友数据,但出现以下错误:

-JSONValue failed. Error is: Unexpected end of input

更新信息

我正在尝试解析所有检索到的数据(最终是 JSON 格式)并将所有 Facebook 朋友详细信息保存到我的数据库中。所有检索和保存到 db 部分的实现都是在 Facebook Sync 按钮操作中完成的。

需要一些帮助,任何帮助都会受到极大的赞扬,谢谢:)

4

2 回答 2

5

更新:

- (void)request:(FBRequest *)request didLoad:(id)result {
        if ([result isKindOfClass:[NSArray class]] && ([result count] > 0)) {
            result = [result objectAtIndex:0];
        }
        friends = [[NSMutableArray alloc] initWithCapacity:1];
        NSArray *resultData = [result objectForKey:@"data"];
        if ([resultData count] > 0) {
            for (NSUInteger i=0; i<[resultData count] && i < 25; i++) {
                [friends addObject:[resultData objectAtIndex:i]];
            }
            [friends retain];
            [tblInviteFriends reloadData];              
        } else {
                UIAlertView *alt=[[UIAlertView alloc]initWithTitle:@"No Friends" message:@"You have no friends." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [alt show];
                [alt release];
        }
}

cellForRowAtIndexPath并以如下方式显示该数据...

cell.textLabel.text = [[friends objectAtIndex:indexPath.row] objectForKey:@"name"]

定义yourDataArray为 aNSMutableArray并将其UITableView用于数据显示

我希望这是对你有帮助的玩具...

于 2013-04-05T07:32:39.117 回答
0

我不确定您是指具体使用 SQLite 还是 Core Data,但无论如何,您都需要以某种方式序列化这些数据。您可以使用许多方法和库。我个人最喜欢的是使用 Mantle 作为我自己模型的基准。

所以,假设我需要使用我得到的查询响应创建一个用户对象。

[FBRequestConnection startWithGraphPath:@"/fql"
                             parameters:queryParam
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection,
                                          id result,
                                          NSError *error) {
                          if (!error) {
                              NSMutableArray *users = [NSMutableArray array];
                              for (NSDictionary *userInfo in result) {
                                  User *user = [User modelWithRemoteDictionary:userInfo];
                                  [users addObject:user];
                              }
                          }
                      }];

好的,所以分解一下。您正在对结果对象使用快速枚举来单独获取每个字典。然后,您将该字典序列化为User您为其创建模型的对象。Mantle 提供了modelWithRemoteDictionary:,它实际上只是针对您在User模型中预设为私有方法的键序列化字典,然后将它们设置为同一User模型的公共属性。最后,将每个对象添加到一个数组中。

你的最终产品是那个阵列,你可以用它来做任何你想做的事情。

我希望这有帮助!

编辑:

跳过模型:

[FBRequestConnection startWithGraphPath:@"/fql"
                             parameters:queryParam
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection,
                                          id result,
                                          NSError *error) {
                          if (!error) {
                              self.users = [NSMutableArray array];
                              for (NSDictionary *userInfo in result) {
                                  [self.users addObject:userInfo];
                              }
                          }
                      }];

举个例子,让我们使用cellForRowAtIndexPath:来展示你稍后将如何使用这个数组:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Allocate, and set the cell...

    NSDictionary *userDict = self.users[indexPath.row];

    cell.name = userDict[@"facebook_name"];
    cell.username = userDict[@"facebook_username"];
    cell.birthday = userDict[@"facebook_birthday"];
}
于 2013-04-04T07:27:52.103 回答