2013-04-04 46 views
2

我已经为了在一次检索的朋友列表中使用FQL查询:解析检索到的Facebook好友相关内容

-(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 
.................. 
} 

我得到下面的输出:

enter image description here

我已经通过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

UPDATE-INFO

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

需要一些帮助,任何帮助是极大的赞赏,感谢:)

+0

你正在使用什么样的数据库服务?例如,如果您碰巧使用了Parse,则有一种预先构建的方法可以为您执行此类事情。 – jakenberg 2013-04-04 07:04:42

+0

@ jsksma2我正在使用sqlite数据库,我需要单独从我的文章的屏幕截图中显示的json格式检索到的Facebook朋友详细信息中,然后将这些详细信息保存在数据库中 – 2013-04-04 07:13:55

回答

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"] 

定义yourDataArrayNSMutableArray,并用它在UITableView数据显示

我希望这是有益的玩具,你...

+0

对不起,Paras,我想我很烦恼你,我不明白我到底是怎么了,早些时候我用图形对象来获取好友的详细资料并保存到数据库,但是因为它碰到Facebook服务器的时间比朋友的数量多很多,所以我需要去一次获取所有朋友的FQL查询,然后存储到数据库。所以我能够获取好友数据,这就是好的,但我需要解析数据,你提供的代码没有工作。我认为问题是“结果“是id类型的,但我们将其分配为数据。 – 2013-04-05 07:45:12

+0

@EshwarChaitanya尝试fql.query而不是:@“/ fql” – 2013-04-05 07:52:18

+0

也尝试我的代码,我现在更新..尝试它会工作.. – 2013-04-05 07:54:14

0

我不知道你指的是使用SQLite或核心数据明确,但无论如何,你需要以某种方式序列化此数据。您可以使用许多方法&库。我个人最喜欢的是将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"]; 
} 
+0

对不起,但是我们确实需要一个模型类(用户),只是想分配检索的JSON输出与名称,ID,出生日期到我的字符串 – 2013-04-04 07:39:02

+0

你可以这样做。我在模型片中添加了,因为没有它,你正在挖一个洞。如果您稍后决定要通过获取更多FB信息来将对象添加到字典中,则必须通过与此相同的各种调用,并写出额外的代码行以使用数据。 如果你仍然坚持不使用模型出于某种原因,然后将'User'对象与'NSDictionary'一起使用,将其设置为键的对象,并将其添加到数组中。 – jakenberg 2013-04-04 07:46:43

+0

请原谅,请你清楚解释一下,我实际上无法得到你我有facebookid,facebookName,facebookBirthday等字符串,现在我想拆分json数据并相应地分配这些值,你可以在屏幕截图中看到我的在JSON中正在提取数据。实际上,我尝试导入JSON.h文件,并试图分配此:NSMutableDictionary * dataDictionary = [result JSONValue];然后分配给我的字符串,如下所示:self.facebookID = [dataDictionary objectForKey:@“uid”]; self.facebookName = [dataDictionary objectForKey:@“name”] etc.but但它不起作用 – 2013-04-04 07:56:57