Как да изпратите FQL заявка с новия Android SDK

Търсих в уебсайта developers.facebook в търсене на начин да използвам новия SDK и да изпращам FQL заявки, но изглежда, че всичко се е променило и документацията говори за всякакви други начини за заявяване на me или friends, но не и конкретна информация, като например дали тези приятели използват приложението ми или не?

така че записах хубава FQL заявка

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

и сега всичко, което трябва да направя, е да го стартирам.

Тъй като единствените заявки, които изглеждат добри за връщане на списък с приятели, са Request.executeMyFriendsRequestAsync и Request.newMyFriendsRequest предположих, че ще са мои приятели, но и двете не позволяват фина настройка на FQL заявка.

как мога да изпратя запитване и да получа обратно списък с приятели или поне JSONArray?

урокът за Hackbook - FQL Query използва старата версия на SDK и не знам какво да правя.

АКТУАЛИЗАЦИЯ:

Добавих тези редове код, мислейки, че ще ми позволят да създам тази заявка:

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

    }
}

Направих това, мислейки, че ще редактирам заявката и ще добавя информацията, която искам, но получих тази грешка:

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)

person thepoosh    schedule 30.10.2012    source източник


Отговори (3)


Бихте направили нещо подобно:

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

По същество правите заявка за Graph API към крайната точка "/fql", като вашата заявка се предава на параметъра "q".

person C Abernathy    schedule 31.10.2012
comment
Благодаря много! Просто не разбирах как да използвам новия формат на Graph-API с този SDK... - person thepoosh; 04.11.2012
comment
Наистина работи, но имам въпрос защо не връща всичките ми приятели? само малко. - person JayR; 15.07.2014
comment
точно както при използването на GraphRequest.newMyFriendsRequest, това ще върне само приятелите, които също са инсталирали вашето приложение, а не всички приятели. - person marmor; 30.03.2015
comment
Класът на сесията вече не е наличен в най-новата версия на SDK. - person Stepan Yakovenko; 29.11.2015

Опитайте този метод

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);    
    }
person Sunny    schedule 11.04.2013
comment
Класът на сесията вече не е наличен в най-новата версия на SDK. - person Stepan Yakovenko; 29.11.2015

Ето връзка към тема, в която се обсъжда това: FQL с използване на facebook android SDK

Можете също така просто да изпратите Graph API извикване с този формат: graph.facebook.com/fql?q=QUERY

Така че във вашия случай може да изглежда така: graph.facebook.com/fql?q=select uid, name, pic_square, is_app_user from user where uid in (select uid2 from friend where uid1 = me())

РЕДАКТИРАНЕ: Изглежда, че извадка от тази функционалност съществува в примерното приложение „Hackbook“ https://github.com/facebook/facebook-android-sdk/blob/master/examples/Hackbook/src/com/facebook/android/FQLQuery.java

Най-вече този блок от код (ред 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());
person Samantha Gruskin    schedule 30.10.2012
comment
видях това, единственият проблем е, че след новия SDK нямам представа как да направя това. сякаш всичко се е променило - person thepoosh; 30.10.2012
comment
@Samantha, hackbook използва стария SDK, новият дори няма клас Utility, това беше основата за целия въпрос - person thepoosh; 31.10.2012