package com.itap.voiceemoticon.db; import java.util.ArrayList; import java.util.Iterator; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.provider.BaseColumns; import com.itap.voiceemoticon.activity.NotificationCenter; import com.itap.voiceemoticon.activity.NotificationID; import com.itap.voiceemoticon.api.Voice; import com.itap.voiceemoticon.util.StringUtil; public class VoiceDao extends VoiceDb { public static final String CLASS_NAME = "VoiceDao"; public static final String TABLE_NAME = "voice"; public static String[] ALL_PROJECTION = { VoiceColumns._ID, VoiceColumns.VOICE_TITLE, VoiceColumns.VOICE_PATH, VoiceColumns.VOICE_TAGS, VoiceColumns.VOICE_CREATE_TIME }; public static final class VoiceColumns implements BaseColumns { public static final String VOICE_TITLE = "title"; public static final String VOICE_PATH = "path"; public static final String VOICE_TAGS = "tags"; public static final String VOICE_CREATE_TIME = "create_time"; } /*** * rex_node_id + path是唯一主键 */ public static final String UNIQUE_KEY_SELECTION = VoiceColumns.VOICE_PATH + " = ? "; /*** * 保存或者更新 根据唯一键 * * @param voice * @return */ public Long saveOrUpdate(Voice voice) { // rex_proj_id + rex_file_name 构成唯一key SQLiteDatabase db = this.getWriteDB(); long voiceId = voice.id; String[] uniqueKeySelection = new String[] { String.valueOf(voice.url) }; Cursor cursor = db.query(TABLE_NAME, new String[] { VoiceColumns.VOICE_PATH }, UNIQUE_KEY_SELECTION, uniqueKeySelection, null, null, null); ContentValues values = new ContentValues(5); values.put(VoiceColumns.VOICE_TITLE, voice.title); values.put(VoiceColumns.VOICE_PATH, voice.url); values.put(VoiceColumns.VOICE_TAGS, voice.tags); values.put(VoiceColumns.VOICE_CREATE_TIME, voice.creatTime); if (cursor.getCount() == 0) { voiceId = db.insert(TABLE_NAME, null, values); } else { db.update(TABLE_NAME, values, UNIQUE_KEY_SELECTION, uniqueKeySelection); cursor.moveToNext(); voiceId = cursor.getLong(cursor.getColumnIndex(VoiceColumns._ID)); } voice.id = voiceId; this.closeCursor(cursor); return voiceId; } public long insertOrUpdate(SQLiteDatabase db, Voice voice) { long voiceId = voice.id; String[] uniqueKeySelection = new String[] { String.valueOf(voice.url) }; Cursor cursor = db.query(TABLE_NAME, new String[] { VoiceColumns._ID }, UNIQUE_KEY_SELECTION, uniqueKeySelection, null, null, null); ContentValues values = new ContentValues(5); values.put(VoiceColumns.VOICE_PATH, voiceId); values.put(VoiceColumns.VOICE_TITLE, voice.title); values.put(VoiceColumns.VOICE_PATH, voice.url); values.put(VoiceColumns.VOICE_TAGS, voice.tags); values.put(VoiceColumns.VOICE_CREATE_TIME, voice.creatTime); if (cursor.getCount() == 0) { voiceId = db.insert(TABLE_NAME, null, values); } else { db.update(TABLE_NAME, values, UNIQUE_KEY_SELECTION, uniqueKeySelection); cursor.moveToNext(); voiceId = cursor.getLong(cursor.getColumnIndex(VoiceColumns._ID)); } this.closeCursor(cursor); return voiceId; } /*** * 保存或者更新 根据唯一键 * * @param voice * @return */ public void insertOrUpdate(ArrayList<Voice> voiceList) { SQLiteDatabase db = this.getWriteDB(); db.beginTransaction(); Iterator<Voice> voiceIterator = voiceList.iterator(); while (voiceIterator.hasNext()) { Voice voice = voiceIterator.next(); this.insertOrUpdate(db, voice); } db.setTransactionSuccessful(); db.endTransaction(); } /** * * @param rexProj * @param path * @return */ public Voice findVoice(long voiceId, String path) { SQLiteDatabase db = this.getWriteDB(); String[] uniqueKeySelection = new String[] { String.valueOf(voiceId), path }; Cursor cursor = db.query(TABLE_NAME, ALL_PROJECTION, UNIQUE_KEY_SELECTION, uniqueKeySelection, null, null, null); Voice voice = null; if (cursor.moveToNext()) { voice = buildVoiceFromCursor(cursor); } this.closeCursor(cursor); return voice; } /** * 获取所有资源项目 * * @param beUsingSDCard * @return */ public ArrayList<Voice> allVoices() { SQLiteDatabase db = this.getReadDB(); ArrayList<Voice> retList = new ArrayList<Voice>(); Cursor cursor = db.query(TABLE_NAME, ALL_PROJECTION, null, null, null, null, null); while (cursor.moveToNext()) { retList.add(buildVoiceFromCursor(cursor)); } this.closeCursor(cursor); return retList; } /*** * @param rexProj * @return */ public ArrayList<Voice> findRexNodeFiles(Voice voice) { SQLiteDatabase db = this.getReadDB(); long voiceId = voice.id; String selection = VoiceColumns.VOICE_PATH + " = ?"; String[] selectionArgs = new String[] { String.valueOf(voiceId) }; Cursor cursor = db.query(TABLE_NAME, ALL_PROJECTION, selection, selectionArgs, null, null, null); ArrayList<Voice> retList = new ArrayList<Voice>(); while (cursor.moveToNext()) { Voice Voice = buildVoiceFromCursor(cursor); retList.add(Voice); } this.closeCursor(cursor); return retList; } /*** * return rexfile list match condition like "is_valid=true" */ public ArrayList<Voice> findRexNodeValidFiles(Voice voice) { SQLiteDatabase db = this.getReadDB(); long voiceId = voice.id; String clause = VoiceColumns.VOICE_PATH + " = ? and " + VoiceColumns.VOICE_TAGS + " = 1 "; String[] selection = new String[] { String.valueOf(voiceId) }; Cursor cursor = db.query(TABLE_NAME, ALL_PROJECTION, clause, selection, null, null, null); ArrayList<Voice> retList = new ArrayList<Voice>(); while (cursor.moveToNext()) { Voice Voice = buildVoiceFromCursor(cursor); retList.add(Voice); } this.closeCursor(cursor); return retList; } /** * @param Voice * @return */ public int delete(Voice voice) { SQLiteDatabase db = this.getWriteDB(); String voicePath = voice.url; String[] uniqueKeySelection = new String[] { voicePath }; int count = db.delete(TABLE_NAME, UNIQUE_KEY_SELECTION, uniqueKeySelection); NotificationCenter.obtain(NotificationID.N_MY_COLLECT_CHANGE, null).notifyToTarget(); return count; } /** * 读取游标数据创建Voice * * @param cursor * @return */ private Voice buildVoiceFromCursor(Cursor cursor) { long id = cursor.getLong(cursor.getColumnIndex(VoiceColumns._ID)); String title = cursor.getString(cursor.getColumnIndex(VoiceColumns.VOICE_TITLE)); String path = cursor.getString(cursor.getColumnIndex(VoiceColumns.VOICE_PATH)); String tags = cursor.getString(cursor.getColumnIndex(VoiceColumns.VOICE_TAGS)); long creatTime = cursor.getLong(cursor.getColumnIndex(VoiceColumns.VOICE_CREATE_TIME)); Voice voice = new Voice(); voice.id = id; voice.creatTime = (int) creatTime; voice.title = title; voice.url = path; voice.tags = tags; return voice; } /** * 删除全部记录 * * @return 返回删除的行数 */ public int deleleAll() { SQLiteDatabase db = this.getWriteDB(); int linesCount = db.delete(TABLE_NAME, null, null); return linesCount; } /** * 根据rexProjId删除资源文件 * * @param rexProjId * @return */ public int deleteVoices(long voiceId) { SQLiteDatabase db = this.getWriteDB(); String selection = VoiceColumns.VOICE_PATH + "= ?"; String[] selectionArgs = new String[] { String.valueOf(voiceId) }; int linesCount = db.delete(TABLE_NAME, selection, selectionArgs); return linesCount; } /** * 删除多个资源文件,当资源节点id在voiceIds数组里。 * * @param voiceIds * @return */ public int deleteVoices(ArrayList<Long> voiceIds) { SQLiteDatabase db = this.getWriteDB(); String selection = VoiceColumns.VOICE_PATH + " in (" + StringUtil.join(voiceIds, ",") + ")"; int linesCount = db.delete(TABLE_NAME, selection, null); return linesCount; } }