package net.dev123.yibo.db; import java.util.Date; import java.util.List; import net.dev123.commons.Paging; import net.dev123.commons.util.ListUtil; import net.dev123.commons.util.StringUtil; import net.dev123.mblog.entity.Group; import net.dev123.yibome.entity.LocalGroup; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class GroupDao extends BaseDao<Group> { private static final String TABLE = "Group_Info"; public GroupDao(Context context) { super(context); } public LocalGroup save(LocalAccount account, Group group) { if (isNull(account) || isNull(group)) { return null; } LocalGroup result = getGroup(account, group); if (result != null) { return result; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { long remoteGroupId = 0l; Date createdAt = new Date(); int state = LocalGroup.STATE_ADDED; if (group instanceof LocalGroup) { LocalGroup localGroup = (LocalGroup)group; remoteGroupId = localGroup.getRemoteGroupId(); createdAt = localGroup.getCreatedAt(); state = localGroup.getState(); result = localGroup; } else { result = new LocalGroup(); } ContentValues values = new ContentValues(); values.put("SP_Group_ID", group.getId()); values.put("Remote_Group_ID", remoteGroupId); values.put("Group_Name", group.getName()); values.put("Created_At", createdAt.getTime()); values.put("State", state); values.put("Account_ID", account.getAccountId()); long rowId = sqLiteDatabase.replace(TABLE, null, values); if (group instanceof LocalGroup) { result.setGroupId(rowId); result.setId(group.getId()); result.setRemoteGroupId(remoteGroupId); result.setName(group.getName()); result.setCreatedAt(createdAt); result.setState(state); result.setAccountId(account.getAccountId()); } sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } return result; } public void save(LocalAccount account, List<Group> groupList) { if (isNull(account) || ListUtil.isEmpty(groupList)) { return; } for (Group group : groupList) { save(account, group); } } public int update(LocalGroup group) { if (isNull(group)) { return -1; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); int rowsAffected = 0; try { ContentValues values = new ContentValues(); values.put("Group_ID", group.getGroupId()); values.put("SP_Group_ID", group.getSpGroupId()); values.put("Remote_Group_ID", group.getRemoteGroupId()); values.put("Group_Name", group.getName()); long createTime = (group.getCreatedAt() == null ? 0 : group.getCreatedAt().getTime()); values.put("Created_At", createTime); values.put("State", group.getState()); values.put("Account_ID", group.getAccountId()); rowsAffected = sqLiteDatabase.update(TABLE, values, "Group_ID = " + group.getGroupId(), null); sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } return rowsAffected; } public boolean logicalDelete(LocalGroup group) { if (isNull(group)) { return false; } group.setState(LocalGroup.STATE_DELETED); update(group); return true; } public int delete(LocalGroup group) { if (isNull(group)) { return -1; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); int rowsAffected = sqLiteDatabase.delete(TABLE, "Group_ID = " + group.getGroupId(), null); return rowsAffected; } public int delete(LocalAccount account, Group group) { if (isNull(account) || isNull(group)) { return -1; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); String whereClause = "SP_Group_ID = " + group.getId() + " and Account_ID = " + account.getAccountId(); int rowsAffected = sqLiteDatabase.delete(TABLE, whereClause, null); return rowsAffected; } public List<Group> findAll(LocalAccount account) { if (account == null) { return null; } String sql = "select * from Group_Info where Account_ID = " + account.getAccountId() + " and State != " + LocalGroup.STATE_DELETED; return find(sql); } public Group findById(long groupId) { String sql = "select * from Group_Info where Group_ID = " + groupId; return this.query(sql); } public LocalGroup getGroup(LocalAccount account, Group group) { if (account == null || group == null) { return null; } String groupName = group.getName(); if (StringUtil.isNotEmpty(groupName)) { groupName = groupName.replace("'", "''"); } String sql = "select * from Group_Info where SP_Group_ID = '" + group.getId() + "' and Account_ID = " + account.getAccountId() + " and Group_Name = '" + groupName + "'"; return (LocalGroup)this.query(sql); } public List<Group> getGroups(LocalAccount account, Paging<Group> paging) { List<Group> groupList = null; if (account == null || paging == null) { return groupList; } String sql = "select " + " * " + "from " + " Group_Info " + "where " + " State != " + LocalGroup.STATE_DELETED + " and " + " Account_ID = " + account.getAccountId() + " " + "order by Created_At asc"; groupList = find(sql, paging.getPageIndex(), paging.getPageSize()); if (ListUtil.isEmpty(groupList) || groupList.size() < paging.getPageSize() / 2) { paging.setLastPage(true); } return groupList; } public boolean merge(LocalAccount account, List<Group> newGroupList) { boolean hasChange = false; if (account == null || ListUtil.isEmpty(newGroupList)) { return hasChange; } List<Group> oldGroupList = findAll(account); if (ListUtil.isEmpty(oldGroupList)) { hasChange = true; return hasChange; } for (Group group : newGroupList) { if (!oldGroupList.contains(group)) { save(account, group); hasChange = true; } } for (Group group : oldGroupList) { if (!newGroupList.contains(group)) { //delete delete((LocalGroup)group); hasChange = true; } } return hasChange; } @Override public LocalGroup extractData(SQLiteDatabase sqLiteDatabase, Cursor cursor) { LocalGroup group = new LocalGroup(); group.setId(cursor.getString(cursor.getColumnIndex("SP_Group_ID"))); group.setGroupId(cursor.getLong(cursor.getColumnIndex("Group_ID"))); group.setSpGroupId(cursor.getString(cursor.getColumnIndex("SP_Group_ID"))); group.setRemoteGroupId(cursor.getLong(cursor.getColumnIndex("Remote_Group_ID"))); group.setName(cursor.getString(cursor.getColumnIndex("Group_Name"))); group.setState(cursor.getInt(cursor.getColumnIndex("State"))); long time = cursor.getLong(cursor.getColumnIndex("Created_At")); if (time > 0) { group.setCreatedAt(new Date(time)); } group.setAccountId(cursor.getLong(cursor.getColumnIndex("Account_ID"))); return group; } }