2012-10-30 7 views
9

Ich habe über die developers.facebook Website nach einer Möglichkeit gesucht, das neue SDK zu verwenden und FQL-Abfragen zu senden, aber es scheint alles hat sich geändert und die Dokumentation spricht über alle Arten von anderen Möglichkeiten zur Anfrage me oder friends aber keine spezifischen Informationen wie sind diese Freunde mit meiner App oder nicht?So senden Sie eine FQL-Abfrage mit dem neuen Android SDK

so schrieb ich eine nette FQL Abfrage

unten
select uid, name, pic_square, is_app_user from user where uid in (select uid2 from friend where uid1 = me()) 

und jetzt, alles, was ich tun muß, ist es laufen.

Da die einzigen Anforderungen, die für die Rückgabe einer Liste von Freunden gut scheinen, sind Request.executeMyFriendsRequestAsync und Request.newMyFriendsRequest Ich nahm they'ed meine Freunde sein, aber beide nicht die Feinabstimmung eines FQL Abfrage ermöglichen.

Wie kann ich eine Anfrage senden und eine Liste von Freunden oder mindestens JSONArray zurückbekommen?

Das Hackbook - FQL Query Tutorial verwendet die alte Version des SDK und ich weiß nicht, was zu tun ist.

UPDATE:

ich diese Zeilen Code hinzugefügt dachte, es mir diese Abfrage erstellen lassen: diese

public void onCreate(Bundle savedInstanceState) { 
    // SOME CODE 
    this.openSession(); 
} 

protected void onSessionStateChange(SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     Session activeSession = getSession().getActiveSession(); 
     facebook.setAccessToken(activeSession.getAccessToken()); 
     facebook.setAccessExpires(activeSession.getExpirationDate().getTime()); 

     Request req = Request.newMyFriendsRequest(activeSession, new GraphUserListCallback() { 

      @Override 
      public void onCompleted(List<GraphUser> users, Response response) { 
       System.out.println(response.toString()); 

      } 
     }); 
     Bundle params = new Bundle(); 
     params.putString("method", "fql.query"); 
     params.putString("query", "select uid, name, pic_square, is_app_user " + "from user where uid in " 
       + "(select uid2 from friend where uid1 = me())"); 
     req.setParameters(params); 
     Request.executeBatchAsync(req); 

    } 
} 

ich es tat, dachte er die Anfrage die Informationen bearbeiten wird, und fügen Sie Ich möchte, aber ich habe diesen Fehler:

10-31 09:36:31.647: E/AndroidRuntime(15986): java.lang.NullPointerException 
10-31 09:36:31.647: E/AndroidRuntime(15986): at com.sample.facebook.to.db.MainActivity$1.onCompleted(MainActivity.java:62) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at com.facebook.Request$2.onCompleted(Request.java:269) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at com.facebook.Request$4.run(Request.java:1197) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at android.os.Handler.handleCallback(Handler.java:587) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at android.os.Looper.loop(Looper.java:130) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at android.app.ActivityThread.main(ActivityThread.java:3691) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at java.lang.reflect.Method.invokeNative(Native Method) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at java.lang.reflect.Method.invoke(Method.java:507) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
10-31 09:36:31.647: E/AndroidRuntime(15986): at dalvik.system.NativeStart.main(Native Method) 

Antwort

21

Sie würden so etwas wie tun:

String fqlQuery = "select uid, name, pic_square, is_app_user from user where uid in (select uid2 from friend where uid1 = me())"; 
Bundle params = new Bundle(); 
params.putString("q", fqlQuery); 

Session session = Session.getActiveSession(); 
Request request = new Request(session, 
    "/fql", 
    params, 
    HttpMethod.GET, 
    new Request.Callback(){ 
     public void onCompleted(Response response) { 
     Log.i(TAG, "Got results: " + response.toString()); 
    } 
}); 
Request.executeBatchAsync(request); 

Sie sind im Grunde ein Graph API-Anforderung an den "/ FQL" Endpunkt mit Ihrer Abfrage übergeben zu machen, um der "q" -Parameter.

+0

danke ein Haufen! Ich bekam gerade nicht, wie man das neue Format von 'Graph-API' mit diesem SDK benutzt ... – thepoosh

+0

arbeitete wie Magie! Vielen Dank! – TharakaNirmana

+0

Es funktioniert wirklich, aber ich habe eine Frage, warum es nicht alle meine Freunde zurückgibt? nur ein paar. – JayR

1

Hier ist ein Link zu einem Thread th bei bespricht dies: FQL using facebook android SDK

können Sie auch ausgeben nur ein Graph API-Aufruf mit diesem Format: graph.facebook.com/fql?q=QUERY

Also in Ihrem Fall kann es wie folgt aussehen: graph.facebook. ? com/FQL q = uid auswählen, Namen, pic_square, is_app_user von Benutzer wo uid in (UID2 von Freund wählen, wo UID1 me =())

EDIT: Es scheint, dass in der Probe eine Probe dieser Funktionalität lebt App "Hackbook" https://github.com/facebook/facebook-android-sdk/blob/master/examples/Hackbook/src/com/facebook/android/FQLQuery.java

Vor allem dieser Block Code (Zeile 61):

String query = mFQLQuery.getText().toString(); 
Bundle params = new Bundle(); 
params.putString("method", "fql.query"); 
params.putString("query", query); 
Utility.mAsyncRunner.request(null, params, new FQLRequestListener()); 
+0

sahen, ist das einzige Problem, dass seit dem neuen SDK ich keine Ahnung, wie dies zu tun. es ist, als hätte sich alles verändert – thepoosh

+0

@Samantha, hackbook benutzt das alte SDK, das neue hat nicht einmal die 'Utility' Klasse, das war die Basis für die ganze Frage – thepoosh

2

versuchen Sie diese Methode

void a(){ 
     String fqlQuery = "{" + 
       "'friends':'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 25'," + 
       "'friendinfo':'SELECT uid, name, pic_square FROM user WHERE uid IN " + 
       "(SELECT uid2 FROM #friends)'," + 
       "}"; 
      Bundle params = new Bundle(); 
      params.putString("q", fqlQuery); 
      Session session = Session.getActiveSession(); 
      Request request = new Request(session, 
       "/fql",       
       params,       
       HttpMethod.GET,     
       new Request.Callback(){   
        public void onCompleted(Response response) { 
         Log.i(TAG, "Result: " + response.toString()); 
        }     
      }); 
      Request.executeBatchAsync(request);  
    } 
+0

Die Sitzungsklasse ist in der neuesten Version des SDK nicht mehr verfügbar. –