Запрос FQL для получения друзей друзей в Facebook в ближайшие 30 дней с помощью Android

Я пишу Android приложение, в котором я собираю список друзей те дни рождения в текущем месяце , используя ниже код:

Calendar c = Calendar.getInstance(); int month = c.get(Calendar.MONTH) + 1; String query = "select name, birthday, uid, pic_square from user where (substr(birthday_date, 0, 2) =" + month +") AND uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) order by birthday_date ASC"; 

Но теперь я хочу получить список друзей facebook за эти дни рождения в ближайшие 30 дней , я знаю код Java, чтобы получить следующие 30 дней, используя текущую дату, как показано ниже:

  Date today = new Date(); Calendar cal = new GregorianCalendar(); cal.setTime(today); cal.add(Calendar.DAY_OF_MONTH, +30); Date today30 = cal.getTime(); 

Я знаю запрос Python для того, чтобы получить дни рождения в ближайшие 30 дней, но я не знаю, какой код мне нужно использовать на Java, если это возможно, пожалуйста, замените для меня следующий запрос в Java:

  query = "SELECT username FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) AND (substr(birthday_date, 0, 2) = {0} AND substr(birthday_date, 3, 5) >= {1} AND substr(birthday_date, 3, 5) <= {2})").format(today.strftime("%m"), today.strftime("%d"), today30.strftime("%d"); 

Итак, я просто хочу заменить код python на java-код

Ну, в первую очередь, не забудьте попросить разрешения для friends_birthday , но без этого вы не сможете получить даты рождения ваших друзей.

Если вы не знакомы с API-интерфейсом Graph API , вам следует – вы можете проверить запросы FQL, чтобы найти проблемы.

Нажмите «Получить токен доступа» и в «Разрешениях данных друзей» установите флажок «friends_birthday», и вы можете протестировать запрос.

Во-вторых, все дни рождения хранятся с фактическим годом рождения, поэтому запрос above today в запросе FQL всегда ничего не возвращает. «Исправить» дату – вы можете фактически выбрать часть дня рождения и в этом году так:

 SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' 

И здесь возникает проблема:

Выбранное поле не является частью таблицы пользователя, и вы не можете сортировать его или даже использовать ГДЕ на нем. Я предполагаю, что вы должны получить всех своих друзей на день рождения и использовать JAVA для фильтрации данных. Это должно быть легко, так как дата в пользовательском выбранном поле имеет 2013 год вместо реального года.

Не стесняйтесь протестировать FQL с помощью этой ссылки.

EDIT # 1

Я хочу что-то понять, исходный запрос, который вы хотите преобразовать, не будет

Забрать список друзей Facebook в дни рождения в ближайшие 30 дней

При замене значений вручную в запросе я видел, что он возвращает всех друзей с днем ​​рождения между двумя заданными днями в том же месяце . Он не находит всех друзей, у которых есть день рождения в ближайшие 30 дней.

EDIT # 2

Я нашел способ завести всех друзей с днем ​​рождения в этом месяце, а затем – что намного лучше, чем пройти список всех друзей.

 SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03') 

Это должно стать намного проще переходить по списку и фильтровать их до сегодняшнего дня и не более 30 дней с сегодняшнего дня – это лучшее решение, о котором я могу думать.

EDIT # 3 Я могу фактически фильтровать, используя тот же запрос из edit # 2, чтобы получить все после этого, заказанные им:

 SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03') AND birthday_date > '02/23/2013' ORDER BY birthday_date 

И если вы хотите ограничить на 10:

 SELECT name, birthday, birthday_date, concat(substr(birthday_date,0,6),"2013") FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' AND (substr(birthday_date,0,2)='02' OR substr(birthday_date,0,2)='03') AND birthday_date > '02/23/2013' ORDER BY birthday_date LIMIT 10 

Редактировать # 4

Гораздо проще, если вы вычисляете даты на Java и передаете их в запрос

 SELECT name, birthday, birthday_date FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' AND birthday_date > '02/23/2013' AND birthday_date < '04/24/2013' ORDER BY birthday_date ASC 

Редактировать # 5

Некоторые Java-коды:

 Calendar cal = Calendar.getInstance(); Date today = cal.getTime(); SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); String today_formatted = formatter.format(today); cal.add(Calendar.DATE, 30); String today_plus30_formatted = formatter.format(cal.getTime()); String query = "SELECT name, birthday, birthday_date FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND birthday_date != 'null' AND birthday_date > '" + today_formatted + "' AND birthday_date < '" + today_plus30_formatted + "' ORDER BY birthday_date ASC"; 

Я не тестировал его, не устанавливал Java 🙂