package net.dev123.yibo.db; import java.util.Date; import java.util.List; import net.dev123.commons.ServiceProvider; import net.dev123.commons.util.StringUtil; import net.dev123.mblog.entity.Comment; import net.dev123.mblog.entity.Status; import net.dev123.mblog.entity.User; import net.dev123.yibo.common.StatusCatalog; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class CommentDao extends BaseDao<Comment> { private static final String TABLE = "Comment"; private UserDao userDao; private StatusDao statusDao; public CommentDao(Context context) { super(context); userDao = new UserDao(context); statusDao = new StatusDao(context); } public void save(Comment comment, LocalAccount account) { if (isNull(comment)) { return; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { save(sqLiteDatabase, comment, account); sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } } public void batchSave(List<Comment> comments, LocalAccount account) { if (isNull(comments) || isNull(account)) { return; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.beginTransaction(); try { for (Comment comment : comments) { save(sqLiteDatabase, comment, account); } sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); } } void save(SQLiteDatabase sqLiteDatabase, Comment comment, LocalAccount account) { if (isNull(comment)) { return; } ContentValues values = new ContentValues(); values.put("Comment_ID", comment.getId()); values.put("Created_At", comment.getCreatedAt() == null ? 0 : comment.getCreatedAt().getTime()); values.put("Text", comment.getText()); values.put("Source", comment.getSource()); values.put("Is_Truncated", comment.isTruncated() ? 1 : 0); values.put("Is_Favorated", comment.isFavorited() ? 1 : 0); values.put("Service_Provider", comment.getServiceProvider().getServiceProviderNo()); values.put("Account_ID", account == null ? -1 : account.getAccountId()); if (comment instanceof LocalComment) { values.put("Is_Divider", ((LocalComment)comment).isDivider() ? 1 : 0); } else { values.put("Is_Divider", 0); } if (comment.getInReplyToComment() != null) { save(sqLiteDatabase, comment.getInReplyToComment(), null); values.put("In_Reply_To_Comment_ID", comment.getInReplyToComment().getId()); } if (comment.getInReplyToStatus() != null) { statusDao.save(sqLiteDatabase, comment.getInReplyToStatus(), StatusCatalog.Others, null); values.put("In_Reply_To_Status_ID", comment.getInReplyToStatus().getId()); } if (comment.getUser() != null) { userDao.save(sqLiteDatabase, comment.getUser()); values.put("User_ID", comment.getUser().getId()); } sqLiteDatabase.replace(TABLE, null, values); } public int delete(Comment comment, LocalAccount account) { if (isNull(comment) || isNull(account)) { return -1; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); int rowsAffected = sqLiteDatabase.delete(TABLE, "Comment_ID = '" + comment.getId() + "' and Account_ID = " + account.getAccountId(), null); return rowsAffected; } public int delete(LocalAccount account) { if (isNull(account)) { return -1; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); int rowsAffected = sqLiteDatabase.delete(TABLE, "Account_ID = " + account.getAccountId(), null); return rowsAffected; } public Comment findById(String commentId, ServiceProvider sp, boolean isReplyTo) { if (isNull(commentId) || isNull(sp)) { return null; } SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase(); return findById(sqLiteDatabase, commentId, sp, isReplyTo); } Comment findById(SQLiteDatabase sqLiteDatabase , String commentId, ServiceProvider sp, boolean isReplyTo) { String sql = "select * from Comment where Comment_ID = '" + commentId + "' and Service_Provider = " + sp.getServiceProviderNo(); if (isReplyTo) { sql += " and Account_ID = -1"; } return this.query(sqLiteDatabase, sql); } @Override public Comment extractData(SQLiteDatabase sqLiteDatabase, Cursor cursor) { LocalComment comment = new LocalComment(); comment.setId(cursor.getString(cursor.getColumnIndex("Comment_ID"))); long time = cursor.getLong(cursor.getColumnIndex("Created_At")); if (time > 0) { comment.setCreatedAt(new Date(time)); } comment.setText(cursor.getString(cursor.getColumnIndex("Text"))); comment.setSource(cursor.getString(cursor.getColumnIndex("Source"))); comment.setFavorited(1 == cursor.getInt(cursor.getColumnIndex("Is_Favorated"))); comment.setTruncated(1 == cursor.getInt(cursor.getColumnIndex("Is_Truncated"))); comment.setDivider(1 == cursor.getInt(cursor.getColumnIndex("Is_Divider"))); int sp = cursor.getInt(cursor.getColumnIndex("Service_Provider")); comment.setServiceProvider(ServiceProvider.getServiceProvider(sp)); String userId = cursor.getString(cursor.getColumnIndex("User_ID")); if (StringUtil.isNotEmpty(userId)) { User user = (User) userDao.findById(sqLiteDatabase, userId, comment.getServiceProvider()); comment.setUser(user); } String statusId = cursor.getString(cursor.getColumnIndex("In_Reply_To_Status_ID")); if (statusId != null) { Status inReplyToStatus = statusDao.findById(sqLiteDatabase, statusId, comment.getServiceProvider(), true); comment.setInReplyToStatus(inReplyToStatus); } String commentId = cursor.getString(cursor.getColumnIndex("In_Reply_To_Comment_ID")); if (commentId != null) { Comment inReplyToComment = findById(sqLiteDatabase, commentId, comment.getServiceProvider(), true); comment.setInReplyToComment(inReplyToComment); } return comment; } }