package com.kescoode.xmail.db; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessagingException; import com.kescoode.xmail.db.internal.DataDelegate; import com.kescoode.xmail.db.table.EmailSchema; import com.kescoode.xmail.domain.LocalEmail; import com.kescoode.xmail.domain.LocalFolder; /** * 邮件Dao * * @author Kesco Lin */ public class EmailDao extends DataDelegate { public static final String TABLE_NAME = "email"; private static final String SQL_CREATE_TABLE = CREATE_TABLE + TABLE_NAME + " ( " + EmailSchema._ID + PRIMARY_KEY + EmailSchema.UID + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.FOLDER_ID + TYPE_INTEGER + COLUMN_NOT_NULL + ", " + EmailSchema.FROM_LIST + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.TO_LIST + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.CC_LIST + TYPE_TEXT + ", " + EmailSchema.BCC_LIST + TYPE_TEXT + ", " + EmailSchema.IS_READ + TYPE_INTEGER + COLUMN_NOT_NULL + ", " + EmailSchema.IS_FLAGGED + TYPE_INTEGER + COLUMN_NOT_NULL + ", " + EmailSchema.IS_FORWARD + TYPE_INTEGER + COLUMN_NOT_NULL + ", " + EmailSchema.TEXT_PATH + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.HTML_PATH + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.PREVIEW + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.SUBJECT + TYPE_TEXT + COLUMN_NOT_NULL + ", " + EmailSchema.DATE + TYPE_INTEGER + COLUMN_NOT_NULL + ", " + EmailSchema.STATUS + TYPE_INTEGER + COLUMN_NOT_NULL + " );"; public EmailDao(Context context) { super(context); } /** * 把邮件存进数据库 * * @param mail 邮件业务对象 * @return 插入的ID */ public long insertMail2DB(LocalEmail mail) { ContentValues values = new ContentValues(); values.put(EmailSchema.UID, mail.getUid()); values.put(EmailSchema.FOLDER_ID, mail.getFolderId()); values.put(EmailSchema.FROM_LIST, Address.pack(mail.getFrom())); try { values.put(EmailSchema.TO_LIST, Address.pack(mail.getRecipients(Message.RecipientType.TO))); values.put(EmailSchema.CC_LIST, Address.pack(mail.getRecipients(Message.RecipientType.CC))); values.put(EmailSchema.BCC_LIST, Address.pack(mail.getRecipients(Message.RecipientType.BCC))); } catch (MessagingException e) { /* 不会发生的异常 */ } values.put(EmailSchema.IS_READ, mail.isRead()); values.put(EmailSchema.IS_FLAGGED, mail.isFlagged()); values.put(EmailSchema.IS_FORWARD, mail.isForward()); values.put(EmailSchema.TEXT_PATH, mail.getTextPath()); values.put(EmailSchema.HTML_PATH, mail.getHtmlPath()); values.put(EmailSchema.PREVIEW, mail.getPreview()); values.put(EmailSchema.SUBJECT, mail.getSubject()); values.put(EmailSchema.DATE, mail.getInternalDate().getTime()); values.put(EmailSchema.STATUS, mail.getStatus()); Uri uri = context.getContentResolver().insert(parseUri(TABLE_NAME), values); long index = ContentUris.parseId(uri); mail.setId(index); return index; } /** * 更新数据库内的邮件 * * @param mail 邮件业务对象 * @return 更新的ID */ public int updateMail2DB(LocalEmail mail) { ContentValues values = new ContentValues(); values.put(EmailSchema.UID, mail.getUid()); values.put(EmailSchema.FOLDER_ID, mail.getFolderId()); values.put(EmailSchema.FROM_LIST, Address.pack(mail.getFrom())); try { values.put(EmailSchema.TO_LIST, Address.pack(mail.getRecipients(Message.RecipientType.TO))); values.put(EmailSchema.CC_LIST, Address.pack(mail.getRecipients(Message.RecipientType.CC))); values.put(EmailSchema.BCC_LIST, Address.pack(mail.getRecipients(Message.RecipientType.BCC))); } catch (MessagingException e) { /* 不会发生的异常 */ } values.put(EmailSchema.IS_READ, mail.isRead()); values.put(EmailSchema.IS_FLAGGED, mail.isFlagged()); values.put(EmailSchema.IS_FORWARD, mail.isForward()); values.put(EmailSchema.TEXT_PATH, mail.getTextPath()); values.put(EmailSchema.HTML_PATH, mail.getHtmlPath()); values.put(EmailSchema.PREVIEW, mail.getPreview()); values.put(EmailSchema.SUBJECT, mail.getSubject()); values.put(EmailSchema.DATE, mail.getInternalDate().getTime()); values.put(EmailSchema.STATUS, mail.getStatus()); return context.getContentResolver().update(parseUri(TABLE_NAME), values, "uid = ?", new String[]{String.valueOf(mail.getUid())}); } /** * 获取文件夹里的所有邮件 * * @param folder 文件夹对象 * @return 邮件对象数组 */ public LocalEmail[] selectMails4Folder(LocalFolder folder) { Cursor cursor = select(parseUri(TABLE_NAME), "select * from email where folder_id = ?", folder.getId()); int num = cursor.getCount(); LocalEmail[] mails = new LocalEmail[num]; if (num > 0) { int index = 0; if (cursor.moveToFirst()) { do { mails[index] = new LocalEmail(context, folder, cursor); index += 1; } while (cursor.moveToNext()); } else { throw new RuntimeException("DB cannot load emails"); } } cursor.close(); return mails; } /** * 根据邮件ID获取邮件 * * @param folder 所属邮箱文件夹 * @param id 邮件ID * @return 邮件对象 */ public LocalEmail selectMailsFromId(LocalFolder folder, long id) { Cursor cursor; LocalEmail email = null; cursor = select(parseUri(TABLE_NAME), "select * from email where _id = ?", id); if (cursor.moveToFirst()) { email = new LocalEmail(context, folder, cursor); } cursor.close(); return email; } /** * 根据邮件UID获取邮件 * * @param folder 所属邮箱文件夹 * @param uid 邮件UID * @return 邮件对象 */ public LocalEmail selectMailsFromUid(LocalFolder folder, String uid) { Cursor cursor; LocalEmail email = null; cursor = select(parseUri(TABLE_NAME), "select * from email where uid = ?", uid); if (cursor.moveToFirst()) { email = new LocalEmail(context, folder, cursor); } cursor.close(); return email; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /* 目前还是初版,没有升级数据库逻辑 */ } }