java - 如何获取所有 facebook 好友即将到来的生日列表

标签 java android facebook facebook-graph-api android-emulator

我制作了一个程序,其中我获取所有 Facebook 好友的列表,因为他们的生日以 1 月到 12 月的形式出现,所以在这里我获取所有 Facebook 好友的生日,他们也已经过去了,现在我只想显示所有即将到来的生日的列表。

MyLocalDB.java

public class MyLocalDB {
private static final String DATABASE_NAME = "bdrem";
private static final String TABLE_FRIEND = "friend";
private static final String TABLE_FRIEND_TEMP = "friend_temp";
private static final String TABLE_SETTINGS = "settings";
private static final int DATABASE_VERSION = 4;

public static final String KEY_ID = "friendID";
public static final int ID_COLUMN = 0;
// The name and column index of each column in friend's table
public static final String KEY_FBID = "facebookID";
public static final int FBID_COLUMN = 1;
public static final String KEY_NAME = "name";
public static final int NAME_COLUMN = 2;
public static final String KEY_BIRTHDAY = "birthday";
public static final int BIRTHDAY_COLUMN = 3;
public static final String KEY_PIC = "picture";
public static final int PIC_COLUMN = 4;
public static final String KEY_BDAYMESSAGE = "message";
public static final int BDAYMESSAGE_COLUMN = 5;
public static final String KEY_AUTOPOST = "autopost";
public static final int AUTOPOST_COLUMN = 6;

// The name and column index of each column in setting's table
public static final String KEY_SETTINGS_ID = "settingsId";
public static final String KEY_SETTINGS_VALUE = "settingsValue";
public static final int SETTINGS_KEY_COLUMN = 0;
public static final int SETTINGS_VALUE_COLUMN = 1;

private static final String SETTINGS_CREATE = "create table "
        + TABLE_SETTINGS + " ( " + KEY_SETTINGS_ID + " varchar(255), "
        + KEY_SETTINGS_VALUE + " varchar(255)" + " );";

private static final String FRIENDS_CREATE = "create table " + TABLE_FRIEND
        + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_FBID
        + " int, " + KEY_NAME + " varchar(50)," + KEY_BIRTHDAY
        + " varchar(25), " + KEY_PIC + " varchar(255)," + KEY_BDAYMESSAGE
        + " varchar(255), " + KEY_AUTOPOST + " varchar(10)" + " );";

private static final String FRIENDS_TEMP_CREATE = "create table "
        + TABLE_FRIEND_TEMP + " (" + KEY_ID
        + " integer primary key autoincrement, " + KEY_FBID + " int, "
        + KEY_NAME + " varchar(50)," + KEY_BIRTHDAY + " varchar(25), "
        + KEY_PIC + " varchar(255)," + KEY_BDAYMESSAGE + " varchar(255), "
        + KEY_AUTOPOST + " varchar(10)" + " );";

private SQLiteDatabase localDB;
// private final Context context;
private LocalDBHelper dbHelper;

public MyLocalDB(Context context) {
    // this.context = context;
    this.dbHelper = new LocalDBHelper(context, DATABASE_NAME, null,
            DATABASE_VERSION);
}

public void open() throws SQLException {
    localDB = dbHelper.getWritableDatabase();
}

private static class LocalDBHelper extends SQLiteOpenHelper {

    public LocalDBHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "DB create");
        db.execSQL(FRIENDS_CREATE);
        db.execSQL(SETTINGS_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "Upgrading from " + oldVersion + " to " + newVersion
                + ", which may destroy all the old data.");

        // Drop the old table
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_FRIEND);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_FRIEND_TEMP);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS);

        // Create a new one
        onCreate(db);
    }
}

// Local storage should have one table for key-value pair
public String getSettings(String settingsKey) {
    String settingsValue = "";
    try {
        Cursor settings = localDB.query(true, TABLE_SETTINGS, null,
                KEY_SETTINGS_ID + " = ?", new String[] { settingsKey },
                null, null, null, null);
        if ((settings.getCount() == 0) || !settings.moveToNext()) {
            return "";
        }
        settingsValue = settings.getString(SETTINGS_VALUE_COLUMN);
    } catch (SQLiteException ex) {
        Log.d(TAG, ex.getMessage());
    }
    Log.v(TAG, "setting: " + settingsValue);
    return settingsValue;
}

public void setSettings(String key, String value) {
    Log.d(TAG, key + ", " + value);
    try {
        localDB.execSQL("delete from " + TABLE_SETTINGS + " where "
                + KEY_SETTINGS_ID + " = '" + key + "';");
        localDB.execSQL("insert into " + TABLE_SETTINGS + " values ('"
                + key + "', '" + value + "');");
    } catch (SQLiteException ex) {
        Log.d(TAG, ex.getMessage());
    }
}

public List<MyFriend> getAllFriends() {

    return getFriendsFilteredBy(null);
}

public MyFriend getFriendByFbID(String facebookId) {

    Cursor friendResults = localDB.query(false, TABLE_FRIEND, null,
            KEY_FBID + "=" + facebookId, null, null, null, null, null);

    if ((friendResults.getCount() == 0) || !friendResults.moveToNext()) {  //First
        return null;
    }

    MyFriend friend = new MyFriend();
    friend.setBdayMessage(friendResults.getString(BDAYMESSAGE_COLUMN));
    friend.setAutoPost(Boolean.valueOf(friendResults
            .getString(AUTOPOST_COLUMN)));
    return friend;
}

public List<MyFriend> getFriendsFilteredBy(Filter filterBy) {
    List<MyFriend> friends = new ArrayList<MyFriend>();
    String[] resultColumns = new String[] { KEY_ID, KEY_FBID, KEY_NAME,
            KEY_BIRTHDAY, KEY_PIC, KEY_BDAYMESSAGE, KEY_AUTOPOST };

    String selection = null;
    String[] selectionArgs = null;
    String orderBy = KEY_BIRTHDAY;

    if (filterBy != null) {
        switch (filterBy) {
        case MONTH:
            selection = KEY_BIRTHDAY + " LIKE ?";
            selectionArgs = new String[1];
            selectionArgs[0] = MyUtils.getCurrentMonth() + "%";
            orderBy = KEY_BIRTHDAY;
            Log.v(TAG, "localdb.month- " + selectionArgs[0]);
            break;
        case WEEK:
            selection = KEY_BIRTHDAY + " >= ? and " + KEY_BIRTHDAY
                    + " <= ?";
            selectionArgs = new String[2];
            selectionArgs[0] = MyUtils.getCurrentMonth() + "/"
                    + MyUtils.getCurrentWeekDays()[0];
            selectionArgs[1] = MyUtils.getCurrentMonth() + "/"
                    + MyUtils.getCurrentWeekDays()[1];
            orderBy = KEY_BIRTHDAY;
            Log.v(TAG, "localdb.week- " + selectionArgs[0] + ","
                    + selectionArgs[1]);
            break;
        case DAY:
            selection = KEY_BIRTHDAY + " LIKE ?";
            selectionArgs = new String[1];
            selectionArgs[0] = MyUtils.getCurrentMonth() + "/"
                    + MyUtils.getCurrentWeekDays()[0] + "%";
            selectionArgs[0] = "12/23%";
            Log.v(TAG, "localdb.day- " + selectionArgs[0]);
            break;
        default:
            break;
        }
    }
    /*
     * TESTING else{ selection = "name LIKE ?"; selectionArgs = new
     * String[1]; selectionArgs[0] = "%aad%"; }
     */

    Cursor allRows = localDB.query(false, TABLE_FRIEND, resultColumns,
            selection, selectionArgs, null, null, orderBy, null);

    if (allRows.moveToNext()) {
        do {
            String fbId = allRows.getString(FBID_COLUMN);
            String name = allRows.getString(NAME_COLUMN);
            String birthday = allRows.getString(BIRTHDAY_COLUMN);
            String picture = allRows.getString(PIC_COLUMN);
            String message = allRows.getString(BDAYMESSAGE_COLUMN);
            boolean isAutoPost = allRows.getString(AUTOPOST_COLUMN).equals(
                    "false") ? false : true;
            MyFriend friend = new MyFriend(fbId, name, birthday, picture,
                    message, isAutoPost);
            friends.add(friend);
        } while (allRows.moveToNext()); //Next
    }
    return friends;
}

public Report syncFriends(List<MyFriend> friends) {
    Log.v(TAG, "mylocaldb.syncfriends Sync started!" + friends.size());
    localDB.execSQL("DROP TABLE IF EXISTS " + TABLE_FRIEND_TEMP);
    localDB.execSQL(FRIENDS_TEMP_CREATE);

    for (MyFriend friend : friends) {
        insertFriend(friend, TABLE_FRIEND_TEMP);
    }

    localDB.execSQL("update " + TABLE_FRIEND_TEMP
            + " set message = (select message from " + TABLE_FRIEND
            + " where " + TABLE_FRIEND + ".facebookID = "
            + TABLE_FRIEND_TEMP + ".facebookID)");

    localDB.execSQL("update " + TABLE_FRIEND_TEMP
            + " set message = ' ' where message is null;");

    localDB.execSQL("update " + TABLE_FRIEND_TEMP
            + " set autopost = (select autopost from " + TABLE_FRIEND
            + " where " + TABLE_FRIEND + ".facebookID = "
            + TABLE_FRIEND_TEMP + ".facebookID)");

    localDB.execSQL("update " + TABLE_FRIEND_TEMP
            + " set autopost = 'false' where autopost is null;");

    localDB.execSQL("DROP TABLE IF EXISTS " + TABLE_FRIEND);
    localDB.execSQL("ALTER TABLE " + TABLE_FRIEND_TEMP + " RENAME to "
            + TABLE_FRIEND);

    friends.clear();
    friends = getAllFriends();

    Log.v(TAG, "mylocaldb.syncfriends Sync finished." + friends.size());
    return new Report(true, "Friends Synced");
}

public Report storeFriends(List<MyFriend> friends) {
    int count = 0;
    for (MyFriend friend : friends) {
        if (storeFriend(friend).isSuccess == true) {
            count++;
        }
    }

    if (count == friends.size()) {
        return new Report(true, count + " friends stored.");
    } else {
        return new Report(false, "Only " + count + " friends stored.");
    }
}

public Report storeFriend(MyFriend friend) {
    Cursor friendResults = localDB.query(false, TABLE_FRIEND, new String[] {
            KEY_ID, KEY_FBID }, KEY_FBID + "=" + friend.getFbID(), null,
            null, null, null, null);
    Report report = null;
    // If friend doesn't exist, insert it
    if ((friendResults.getCount() == 0) || !friendResults.moveToNext()) {
        report = insertFriend(friend);
        return report;
    }
    // If friend exists, update it
    else {
        long rowId = friendResults.getLong(ID_COLUMN);
        String message = friend.getBdayMessage();
        boolean isAutoPost = friend.isAutoPost();
        report = saveMessage(rowId, message, isAutoPost);
        report = updateFriend(rowId, friend);
        return report;
    }
}

// Insert friend in database

public Report insertFriend(MyFriend friend) {
    return insertFriend(friend, TABLE_FRIEND);
}

public Report insertFriend(MyFriend friend, String tableName) {
    ContentValues newFriend = new ContentValues();
    newFriend.put(KEY_FBID, friend.getFbID());
    newFriend.put(KEY_NAME, friend.getName());
    newFriend.put(KEY_BIRTHDAY, friend.getBday());
    newFriend.put(KEY_PIC, friend.getPic());
    newFriend.put(KEY_BDAYMESSAGE, friend.getBdayMessage());
    boolean isAutoPost = friend.isAutoPost();
    if (isAutoPost) {
        newFriend.put(KEY_AUTOPOST, "true");
    } else
        newFriend.put(KEY_AUTOPOST, "false");

    try {
        localDB.insert(tableName, null, newFriend);
    } catch (SQLiteException ex) {
        return new Report(false, ex.getMessage());
    }

    return new Report(true, "Friend inserted successfully!");
}

// Update friend in database
public Report updateFriend(long rowId, MyFriend friend) {

    ContentValues updatedFriend = new ContentValues();

    updatedFriend.put(KEY_FBID, friend.getFbID());
    updatedFriend.put(KEY_NAME, friend.getName());
    updatedFriend.put(KEY_BIRTHDAY, friend.getBday());
    updatedFriend.put(KEY_PIC, friend.getPic());
    updatedFriend.put(KEY_BDAYMESSAGE, friend.getBdayMessage());
    boolean isAutoPost = friend.isAutoPost();
    if (isAutoPost) {
        updatedFriend.put(KEY_AUTOPOST, "true");
    } else
        updatedFriend.put(KEY_AUTOPOST, "false");

    try {
        String where = KEY_ID + "=" + rowId;
        localDB.update(TABLE_FRIEND, updatedFriend, where, null);
    } catch (SQLiteException ex) {
        return new Report(false, ex.getMessage());
    }
    return new Report(true, "Friend is updated successfully!");
}

public Report saveMessage(long rowId, String message, boolean isAutoPost) {

    ContentValues updatedFriend = new ContentValues();
    updatedFriend.put(KEY_BDAYMESSAGE, message);

    if (isAutoPost) {
        updatedFriend.put(KEY_AUTOPOST, "true");
    } else
        updatedFriend.put(KEY_AUTOPOST, "false");

    try {
        String where = KEY_ID + "=" + rowId;
        localDB.update(TABLE_FRIEND, updatedFriend, where, null);
    } catch (SQLiteException ex) {
        return new Report(false, ex.getMessage());
    }
    return new Report(true, "Friend is updated successfully!");
}

public Report saveMessageByFbID(String ID, String message,
        boolean isAutoPost) {

    ContentValues updatedFriend = new ContentValues();
    updatedFriend.put(KEY_BDAYMESSAGE, message);
    updatedFriend.put(KEY_AUTOPOST, isAutoPost ? "true" : "false");

    try {
        String where = KEY_FBID + " = ?";
        localDB.update(TABLE_FRIEND, updatedFriend, where,
                new String[] { ID });
    } catch (SQLiteException ex) {
        return new Report(false, ex.getMessage());
    }
    return new Report(true, "Friend is updated successfully!");
}

public Report removeFriend(long rowId) {

    String where = KEY_ID + "=" + rowId;
    try {
        localDB.delete(TABLE_FRIEND, where, null);
    } catch (SQLiteException ex) {
        return new Report(false, ex.getMessage());
    }
    return new Report(false, "Friend is removed successfully!");
}

public void close() {
    localDB.close();
}
   }

最佳答案

这里没有什么难的。使用图形 API:

  1. 获取您的用户出生日期:/YOUR_ID?fields=friends.fields(birthday)
  2. 根据每个人的生日和月份对日期进行排序
  3. 获取当前日期并显示以下出生日期。

关于java - 如何获取所有 facebook 好友即将到来的生日列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971903/

相关文章:

java - 如何区分同一个整数对象?

java 提取 Zip 文件

Android:splitActionBarWhenNarrow 的问题

facebook - Chatbot - 使用 Facebook 登录为您不拥有的页面生成页面 token

java - 如何包装 Java String.format()?

java - 从 HTML 复制/粘贴到 MS Excel 时如何处理换行符

安卓 : JSONArray[0] is not a JSONObject

android - 我如何从这个 JSON 中获取国家、州和城市的列表?

android - 在移动设备上测试时,Facebook 事件会导致崩溃

iphone - NSInteger 和 facebookId