package net.dev123.yibo.db; import java.util.List; import net.dev123.commons.Paging; import net.dev123.commons.ServiceProvider; import net.dev123.commons.util.ListUtil; import net.dev123.commons.util.StringUtil; import net.dev123.entity.BaseUser; import net.dev123.mblog.entity.User; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; public class SocialGraphDao { private static final String TABLE = "Social_Graph"; private UserDao userDao; private DBHelper dbHelper; public SocialGraphDao(Context context) { dbHelper = DBHelper.getInstance(context); userDao = new UserDao(context); } public void save(User userA, User userB, Relation relation, ServiceProvider sp) { SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { save(sqLiteDatabase, userA, userB, relation, sp); sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } } void save(SQLiteDatabase sqLiteDatabase, User userA, User userB, Relation relation, ServiceProvider sp) { ContentValues values = new ContentValues(); values.put("User_A_ID", userA.getId()); values.put("User_B_ID", userB.getId()); values.put("Service_Provider", sp.getServiceProviderNo()); values.put("Relationship", relation.getType()); sqLiteDatabase.replace(TABLE, null, values); } public void delete(User userA, User userB, Relation relation, ServiceProvider sp) { SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { String whereClause = " USER_A_ID = '?' AND USER_B_ID = '?' AND Relationship = ? AND Service_Provider = ?"; String[] whereArgs = new String[4]; whereArgs[0] = userA.getId(); whereArgs[1] = userB.getId(); whereArgs[2] = String.valueOf(sp.getServiceProviderNo()); whereArgs[3] = String.valueOf(relation.getType()); sqLiteDatabase.delete(TABLE, whereClause, whereArgs); sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } } public List<BaseUser> getFriends(User user, Paging<? extends BaseUser> paging) { if (user == null || paging == null) { return null; } return getUsers(user, paging, Relation.Followingship); } public List<BaseUser> getFollowers(User user, Paging<? extends BaseUser> paging) { if (user == null || paging == null) { return null; } return getUsers(user, paging, Relation.Followedship); } private List<BaseUser> getUsers(User user, Paging<? extends BaseUser> paging, Relation relation){ StringBuilder sql = new StringBuilder(); int providerNo = user.getServiceProvider().getServiceProviderNo(); sql.append( "select " + " a.* " + "from " + " User a, Social_Graph b " + "where " + " b.User_A_ID = '" + user.getId() + "' and " + " b.User_B_ID = a.User_ID and " + " b.Service_Provider = " + providerNo + " and " + " b.Relationship = " + relation.getType() + " " + "order by a.Screen_Name asc " ); List<BaseUser> userList = userDao.find(sql.toString(), paging.getPageIndex(), paging.getPageSize()); if (ListUtil.isEmpty(userList) || userList.size() < paging.getPageSize() / 2) { paging.setLastPage(true); } return userList; } public void saveFriends(User user, List<User> friends) { saveSocialGraph(user, friends, Relation.Followingship); } public void saveFollowers(User user, List<User> followers) { saveSocialGraph(user, followers, Relation.Followedship); } private void saveSocialGraph(User user, List<User> users, Relation relation){ SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { for(User u : users){ save(sqLiteDatabase, user, u, relation, user.getServiceProvider()); userDao.save(sqLiteDatabase, u); } sqLiteDatabase.setTransactionSuccessful(); } finally{ sqLiteDatabase.endTransaction(); } } public List<BaseUser> findUsers(BaseUser user, String filterName, Relation relation) { List<BaseUser> listUser = null; if (user == null || StringUtil.isEmpty(filterName)) { return listUser; } if (relation == null) { relation = Relation.Followingship; } StringBuilder sql = new StringBuilder(); int providerNo = user.getServiceProvider().getServiceProviderNo(); sql.append( "select " + " a.* " + "from " + " User a, Social_Graph b " + "where " + " b.User_A_ID = '" + user.getId() + "' and " + " b.User_B_ID = a.User_ID and " + " b.Service_Provider = " + providerNo + " and " + " b.Relationship = " + relation.getType() + " and " + " ( a.Screen_Name like '%" + filterName + "%' or " + " a.Name like '%" + filterName + "%')" ); return userDao.find(sql.toString()); } }