2012-10-30 10 views
9

Szukałem na stronie developers.facebook szukając sposobu na użycie nowego SDK i wysyłania zapytań FQL, ale wygląda na to, że wszystko się zmieniło i dokumentacja mówi o wszystkim rodzaje innych sposobów żądania me lub friends, ale nie konkretne informacje, takie jak te, którzy korzystają z mojej aplikacji, czy nie?Jak wysłać kwerendę FQL z nowym zestawem SDK Androida

więc spisałem piękny FQL zapytanie

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

i teraz, wszystko co musisz zrobić, to uruchomić go.

Ponieważ jedyne prośby, które wydają się dobre dla zwrócenia listy znajomych to Request.executeMyFriendsRequestAsync i Request.newMyFriendsRequest Zakładam, że są moimi przyjaciółmi, ale obie nie pozwalają na precyzyjne dostrojenie zapytania FQL.

Jak wysłać zapytanie i otrzymać listę znajomych lub przynajmniej JSONArray?

Hackbook - samouczek zapytań FQL używa starej wersji SDK i nie wiem, co robić.

UPDATE:

Dodałem te linie kodu myśli to niech mi stworzyć tę kwerendę:

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

    } 
} 

Zrobiłem to, myśląc, będzie zmodyfikować wniosek i dodać informacje Chcę, ale mam ten błąd:

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) 

Odpowiedz

21

Można by zrobić coś takiego:

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

jesteś w zasadzie podejmowania Graph API wniosek do "/" FQL końcowego z zapytaniu przekazywane do parametr "q".

+0

dzięki! Po prostu nie mogłem używać nowego formatu 'Graph-API' z tym SDK ... – thepoosh

+0

pracował jak magia! Dzięki! – TharakaNirmana

+0

To naprawdę działa, ale mam pytanie, dlaczego nie zwraca wszystkich moich znajomych? tylko kilka. – JayR

1

Oto link do wątku th co omówiono poniżej: FQL using facebook android SDK

Można też po prostu wydać Graph API połączenia z następującym formacie: graph.facebook.com/fql?q=QUERY

Więc w twoim przypadku może to wyglądać tak: graph.facebook. ? com/FQL q = SELECT uid, nazwę, pic_square, is_app_user od użytkownika gdzie uid w (wybierz uid2 od znajomego gdzie uid1 = Me())

EDIT: wydaje się, że próbka tej funkcjonalności mieszka w próbce Aplikacja "Hackbook" https://github.com/facebook/facebook-android-sdk/blob/master/examples/Hackbook/src/com/facebook/android/FQLQuery.java

Co najważniejsze, ten blok kodu (linia 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

widział w tym, jedynym problemem jest to, że od nowego SDK nie mam pojęcia jak to zrobić. to tak, jakby wszystko się zmieniło – thepoosh

+0

@Samantha, hackbook używa starego SDK, nowy nie ma nawet klasy "Utility", która była podstawą całego pytania – thepoosh

2

spróbować tej metody

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

Klasa sesji nie jest już dostępna w najnowszej wersji pakietu SDK. –

Powiązane problemy