2012-10-30 9 views
9

Ho cercato sul sito Web developers.facebook cercando un modo per utilizzare il nuovo SDK e inviare query FQL ma sembra che tutto sia cambiato e la documentazione sta parlando di tutto tipi di altri modi per richiedere me o friends ma non informazioni specifiche come ad esempio gli amici che usano la mia app o no?Come inviare una query FQL con il nuovo SDK Android

così ho scritto un bel interrogazione FQL

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

ed ora, tutto quello che devo fare è eseguire esso.

Poiché le uniche richieste che sembrano buone per la restituzione di un elenco di amici sono Request.executeMyFriendsRequestAsync e Request.newMyFriendsRequest, ho pensato che fossero miei amici, ma entrambi non consentono la messa a punto di una query FQL.

Come posso inviare una query e recuperare un elenco di amici o almeno uno JSONArray?

il tutorial Hackbook - Query FQL utilizza la vecchia versione dell'SDK e non so cosa fare.

UPDATE:

Ho aggiunto queste righe di codice pensando che mi permette di creare questa query:

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); 

    } 
} 

ho fatto questo, pensando che permetterà di modificare la richiesta e aggiungere le informazioni Voglio ma ho ricevuto questo errore:

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) 

risposta

21

Si potrebbe fare qualcosa di simile:

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); 

Stai fondamentalmente facendo una richiesta API grafico al "/ FQL" punto finale con la query passata al il parametro "q".

+0

grazie mille! Non stavo proprio ottenendo come usare il nuovo formato di 'Graph-API' con questo SDK ... – thepoosh

+0

ha funzionato come per magia! Grazie! – TharakaNirmana

+0

Funziona davvero, ma ho una domanda, perché non restituisce tutti i miei amici? solo alcune. – JayR

1

Ecco un collegamento a un thread th in questo discute: FQL using facebook android SDK

È anche possibile emettere una chiamata API Grafico con questo formato: graph.facebook.com/fql?q=QUERY

Quindi nel tuo caso può apparire come: graph.facebook. ? com/FQL q = selezionare uid, nome, pic_square, is_app_user dall'utente dove uid a (selezionare uid2 da amico dove uid1 me =())

EDIT: sembra che un campione di questa funzionalità vive nel campione app "Hackbook" https://github.com/facebook/facebook-android-sdk/blob/master/examples/Hackbook/src/com/facebook/android/FQLQuery.java

In particolare, questo blocco di codice (linea 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

visto questo, l'unico problema è che dal momento che il nuovo SDK non ho idea di come fare questo. è come se tutto fosse cambiato – thepoosh

+0

@ Samantha, hackbook usa il vecchio SDK, il nuovo non ha nemmeno la classe 'Utility', che era la base dell'intera domanda – thepoosh

2

provare questo metodo

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

La classe di sessione non è più disponibile nella versione più recente dell'SDK. –

Problemi correlati