我最近开始重新推出我的应用程序,以整合新的Facebook SDK 3.0.1,以符合计划于7月13日发生的重大变化。
直到那时,一切都很完美。我试图通过查询流FQL表来引入新闻源,就像我使用早期的SDK一样。
背景:
我之前的查询(代码)是:
String qryFeeds =
"SELECT post_id, created_time, updated_time, filter_key, actor_id, message, app_data, attachment, comments, likes, place, permalink, description, type FROM stream WHERE filter_key in (SELECT filter_key FROM stream_filter WHERE uid = me() AND type = 'newsfeed') LIMIT 10 OFFSET 0";
Bundle bun = new Bundle();
bun.putString("method", "fql.query");
bun.putString("query", qryFeeds);
String result = Utility.mFacebook.request(bun);
JSONArray JAFeeds = new JSONArray(result);
for (int i = 0; i < JAFeeds.length(); i++) {
JSONObject JOFeeds = JAFeeds.getJSONObject(i);
/** GET THE ACTOR DETAILS **/
if (JOFeeds.has("actor_id")) {
ACTOR_ID = JOFeeds.getString("actor_id");
feeds.setActorID(ACTOR_ID);
// GET ACTOR DETAILS FROM GLOBAL METHOD
String[] strArrActorDetails = userDetails.getActorDetails(ACTOR_ID);
ACTOR_NAME = strArrActorDetails[0];
ACTOR_PROFILE = strArrActorDetails[1];
// SET DETAILS TO THE POJO FOR THE ARRAYLIST
if (ACTOR_NAME != null) {
feeds.setActorName(ACTOR_NAME);
} else {
feeds.setActorName(null);
}
if (ACTOR_PROFILE != null) {
feeds.setActorProfile(ACTOR_PROFILE);
} else {
feeds.setActorProfile(null);
}
} else {
ACTOR_ID = null;
feeds.setActorID(ACTOR_ID);
ACTOR_NAME = null;
feeds.setActorName(ACTOR_NAME);
ACTOR_PROFILE = null;
feeds.setActorProfile(ACTOR_PROFILE);
}
}
在getActorDetails
课程的userDetails
方法中,我会多次调用用户,页面或 app FQL表,用于获取正确的用户详细信息:
try {
// QUERY THE USER FQL TABLE
String queryUser =
"SELECT name, pic_big " +
"FROM user " +
"WHERE uid=" + strActorID;
Bundle bunQryUser = new Bundle();
bunQryUser.putString("method", "fql.query");
bunQryUser.putString("query", queryUser);
String resultQueryUser = Utility.mFacebook.request(bunQryUser);
JSONArray JAUser = new JSONArray(resultQueryUser);
if (JAUser.length() == 0) {
// QUERY THE PAGE FQL TABLE
String queryPage =
"SELECT name, pic_big " +
"FROM page " +
"WHERE page_id=" + strActorID;
Bundle bunQryPage = new Bundle();
bunQryPage.putString("method", "fql.query");
bunQryPage.putString("query", queryPage);
String resultQryPage = Utility.mFacebook.request(bunQryPage);
JSONArray JAPage = new JSONArray(resultQryPage);
if(JAPage.length() == 0) {
// QUERY THE APPLICATION FQL TABLE
String queryApp =
"SELECT display_name, logo_url " +
"FROM application " +
"WHERE app_id = " + strActorID;
Bundle bunQryApp = new Bundle();
bunQryApp.putString("method", "fql.query");
bunQryApp.putString("query", queryApp);
String resultQryApp = Utility.mFacebook.request(bunQryApp);
JSONArray JAApp = new JSONArray(resultQryApp);
if (JAApp.length() == 0) {
// DO NOTHING AT THE MOMENT
} else {
for (int j = 0; j < JAApp.length(); j++) {
JSONObject JOApp = JAApp.getJSONObject(j);
// PROCESS THE RESULT DATA
return new String[] {strActorName, strActorProfile};
}
}
} else {
for (int j = 0; j < JAPage.length(); j++) {
JSONObject JOPage = JAPage.getJSONObject(j);
// PROCESS THE RESULT DATA
return new String[] {strActorName, strActorProfile};
}
}
} else {
for (int j = 0; j < JAUser.length(); j++) {
JSONObject JOUser = JAUser.getJSONObject(j);
// PROCESS THE RESULT DATA
return new String[] {strActorName, strActorProfile};
}
}
} catch (Exception e) {
e.printStackTrace();
}
现在的问题和当前情况:
尝试使用新SDK复制它会产生相当令人困惑的结果。这是使用较新API调用的代码:
Session.openActiveSession(getActivity(), true, new Session.StatusCallback() {
@Override
public void call(final Session session, SessionState state, Exception exception) {
String qryFeeds =
"SELECT post_id, created_time, updated_time, filter_key, " +
"actor_id, message, app_data, attachment, comments, " +
"likes, place, permalink, description, type " +
"FROM stream WHERE filter_key in " +
"(SELECT filter_key FROM stream_filter " +
"WHERE uid = me() AND type = 'newsfeed') " +
"LIMIT 10 OFFSET 0";
Bundle bun = new Bundle();
bun.putString("q", qryFeeds);
Request request = new Request(session, "/fql", bun, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response response) {
// CAST THE RESULT IN A GRAPHOBJECT
GraphObject grphObject = response.getGraphObject();
// CHECK THAT THE GRAPHOBJECT INSTANCE HAS DATA
if (grphObject != null) {
JSONObject JORoot = grphObject.getInnerJSONObject();
try {
// CAST THE JORoot CONTENTS INTO A JSONARRAY
JSONArray JAFeeds = JORoot.getJSONArray("data");
for (int i = 0; i < JAFeeds.length(); i++) {
JSONObject JOFeeds = JAFeeds.getJSONObject(i);
// Log.e("JOFeeds", JOFeeds.toString());
// INSTANTIATE THE NewsfeedData CLASS INSTANCE
feeds = new NewsfeedData();
if (JOFeeds.has("actor_id")) {
final String strActorID = JOFeeds.getString("actor_id");
Log.e("strActorID", strActorID);
feeds.setActorID(strActorID);
String qryAuthor =
"SELECT name, pic_big " +
"FROM user " +
"WHERE uid=" + strActorID;
Bundle bunAuthor = new Bundle();
bunAuthor.putString("q", qryAuthor);
Request reqAuthor = new Request(session, "/fql", bunAuthor, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response resAuthor) {
GraphObject grp = resAuthor.getGraphObject();
JSONObject JORoot = grp.getInnerJSONObject();
try {
JSONArray JAUser = JORoot.getJSONArray("data");
/* GET THE ACTOR DETAILS FROM THE USER FQL TABLE */
if (JAUser.length() != 0) {
for (int i = 0; i < JAUser.length(); i++) {
JSONObject JOUser = JAUser.getJSONObject(i);
// Log.e("JOUser", JOUser.toString());
/* PROCESS THE RESULT DATA */
}
} else {
String qryPage =
"SELECT name, pic_big " +
"FROM page " +
"WHERE page_id=" + strActorID;
Bundle bunPage = new Bundle();
bunPage.putString("q", qryPage);
Request reqPage = new Request(session, "/fql", bunPage, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response resPage) {
GraphObject grpPage = resPage.getGraphObject();
JSONObject JORoot = grpPage.getInnerJSONObject();
try {
JSONArray JAPage = JORoot.getJSONArray("data");
/* GET THE ACTOR DETAILS FROM THE PAGE FQL TABLE */
if (JAPage.length() != 0) {
for (int i = 0; i < JAPage.length(); i++) {
JSONObject JOPage = JAPage.getJSONObject(i);
/* PROCESS THE RESULT DATA */
}
} else {
}
} catch (Exception e) {
e.printStackTrace();
}
}
}); Request.executeBatchAsync(reqPage);
}
} catch (Exception e) {
e.printStackTrace();
}
// Log.e("AUTHOR RESPONSE", resAuthor.toString());
}
}); Request.executeBatchAsync(reqAuthor);
}
/* ADD COLLECTED DATA TO THE ARRAYLIST */
arrFeeds.add(feeds);
lv.setAdapter(adapter);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
}
}
}); Request.executeBatchAsync(request);
}
});
第一个查询工作得很好,并从流 FQL表中获取帖子。但是,对用户,页面或应用 FQL表进行嵌套查询总是最后一次,因此不会显示在ListView中。嵌套查询是不允许的?如果不是这种情况,如何在主流查询中嵌套多个查询?考虑到帖子的作者可以是应用或页面,而不一定是普通 用户,这是必要的。< / p>
P.S。:对不起该帖子的长度。我想不要留下任何东西。 : - )