package com.lq.dao;
import java.io.File;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore.Audio.Media;
import android.provider.MediaStore.Audio.Playlists;
import android.util.Log;
/**
* 对“播放列表”相关的数据库访问进行的封装类
*
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class PlaylistDAO {
public static final String TAG = PlaylistDAO.class.getSimpleName();
/**
* 新建无重名的播放列表
*
* @param resolver
* Context的ContentResolver实例
* @param name
* 新建的播放列表的名称
* @return 如果有重名的播放列表,返回-1;无重名返回新建列表在数据库中的ID
*/
public static int createPlaylist(ContentResolver resolver, String name) {
// 先检查有无同名的播放列表
Cursor cursor_playlist = resolver.query(Playlists.EXTERNAL_CONTENT_URI,
new String[] { Playlists.NAME }, null, null, null);
if (cursor_playlist != null) {
int index_name = cursor_playlist.getColumnIndex(Playlists.NAME);
while (cursor_playlist.moveToNext()) {
if (cursor_playlist.getString(index_name).equals(name)) {
// 如果有同名,返回false
cursor_playlist.close();
Log.i(TAG,
"create new list failed:playlist of the same name already existed");
return -1;
}
}
}
// 没有同名的才新建
ContentValues values = new ContentValues();
values.put(Playlists.NAME, name);
values.put(Playlists.DATE_ADDED, System.currentTimeMillis());
values.put(Playlists.DATE_MODIFIED, System.currentTimeMillis());
Uri newPlaylistUri = resolver.insert(Playlists.EXTERNAL_CONTENT_URI,
values);
Log.i(TAG, "new create playlist uri:" + newPlaylistUri);
int newPlaylistId = Integer
.valueOf(newPlaylistUri.getLastPathSegment());
return newPlaylistId;
}
/**
* 重命名播放列表,如果重名不执行修改
*
* @param resolver
* Context的ContentResolver实例
* @param newName
* 新建的播放列表的名称
* @return 如果有重名的播放列表,返回true;无重名返回false
*/
public static boolean updatePlaylistName(ContentResolver resolver,
String newName, int playlistId) {
// 先检查有无同名的播放列表
Cursor cursor_playlist = resolver.query(Playlists.EXTERNAL_CONTENT_URI,
new String[] { Playlists.NAME }, null, null, null);
if (cursor_playlist != null) {
int index_name = cursor_playlist.getColumnIndex(Playlists.NAME);
while (cursor_playlist.moveToNext()) {
if (cursor_playlist.getString(index_name).equals(newName)) {
// 如果有同名,返回false
cursor_playlist.close();
Log.i(TAG,
"update_list_failed:playlist of the same name already existed");
return true;
}
}
}
// 没有同名的才更新
ContentValues values = new ContentValues();
values.put(Playlists.NAME, newName);
values.put(Playlists.DATE_MODIFIED, System.currentTimeMillis());
int update_row = resolver.update(Playlists.EXTERNAL_CONTENT_URI,
values, Playlists._ID + " = " + playlistId, null);
Log.i(TAG, "update_row:" + update_row);
return false;
}
/**
* 删除指定的播放列表
*
* @param resolver
* Context的ContentResolver实例
* @param playlistId
* 要删除的播放列表的id
*/
public static void deletePlaylist(ContentResolver resolver, int playlistId) {
// 先删除Members表中的记录
Uri uri = Playlists.Members.getContentUri("external", playlistId);
int deleteRow = resolver.delete(uri, Playlists.Members.PLAYLIST_ID
+ " = " + playlistId, null);
Log.i(TAG, "deleted row count in Members:" + deleteRow);
// 再删除Playlists表中的记录
deleteRow = resolver.delete(Playlists.EXTERNAL_CONTENT_URI,
Playlists._ID + " = " + playlistId, null);
Log.i(TAG, "deleted row count in Playlists:" + deleteRow);
}
/**
* 为播放列表添加成员
*
* @param resolver
* Context的ContentResolver实例
* @param playlistId
* 播放列表的ID
* @param audioIds
* 添加的音频ID们
* @return true表示该歌曲已经存在指定列表中,false表示添加成功
*/
public static boolean addTrackToPlaylist(ContentResolver resolver,
long playlistId, long[] audioIds) {
boolean hasExistedItems = false;
long[] existedIds = null;
// 将audioIds变为(2,3,4,5)的形式,作数据库查询条件用
StringBuffer audioIdsstring = new StringBuffer("(");
for (int i = 0; i < audioIds.length; i++) {
audioIdsstring.append(audioIds[i] + ",");
}
audioIdsstring.setCharAt(audioIdsstring.length() - 1, ')');
// 先查询该播放列表中有无该歌曲,有则不做插入
Cursor cursor = resolver.query(
Playlists.Members.getContentUri("external", playlistId),
new String[] { Playlists.Members.AUDIO_ID },
Playlists.Members.AUDIO_ID + " in " + audioIdsstring, null,
null);
if (cursor != null) {
if (cursor.getCount() == audioIds.length) {
// 如果Members表中已经拥有所有要添加的歌曲,直接返回已经存在
cursor.close();
Log.i(TAG,
"add to playlist member failed:members of the same name already existed");
return true;
}
Log.d(TAG, "cursor数目:" + cursor.getCount());
Log.d(TAG, "audioIds数目:" + audioIds.length);
hasExistedItems = !(cursor.getCount() == 0);
if (hasExistedItems) {
existedIds = new long[cursor.getCount()];
int index_id = cursor
.getColumnIndex(Playlists.Members.AUDIO_ID);
int i = 0;
while (cursor.moveToNext()) {
existedIds[i] = cursor.getLong(index_id);
i++;
}
}
}
// 列表中无指定的歌曲,则向Members表中插入记录
Uri uri = Playlists.Members.getContentUri("external", playlistId);
ContentValues values = null;
if (hasExistedItems) {
for (int i = 0; i < audioIds.length; i++) {
if (!isIdInTheIntArray(audioIds[i], existedIds)) {
values = new ContentValues();
values.put(Playlists.Members.PLAY_ORDER, audioIds[i]);
values.put(Playlists.Members.AUDIO_ID, audioIds[i]);
Uri newInsertUri = resolver.insert(uri, values);
Log.i(TAG, "The new uri added to Members:" + newInsertUri);
}
}
} else {
for (int i = 0; i < audioIds.length; i++) {
values = new ContentValues();
values.put(Playlists.Members.PLAY_ORDER, audioIds[i]);
values.put(Playlists.Members.AUDIO_ID, audioIds[i]);
Uri newInsertUri = resolver.insert(uri, values);
Log.i(TAG, "The new uri added to Members:" + newInsertUri);
}
}
return false;
}
private static boolean isIdInTheIntArray(long id, long a[]) {
for (int i = 0; i < a.length; i++) {
if (a[i] == id) {
return true;
}
}
return false;
}
/**
* 从播放列表移除指定歌曲
*
* @param resolver
* Context的ContentResolver实例
* @param playlistId
* 播放列表的ID
* @param audioIds
* 要移除的音频ID
* @return 删除成功返回true,否则返回false
*/
public static boolean removeTrackFromPlaylist(ContentResolver resolver,
long playlistId, long[] audioIds) {
if (audioIds == null) {
return false;
}
boolean isRemoved = false;
int deleteRowCount = 0;
// 将整型数组变成(1,2,3,4,5)的格式,作为稍后的数据库删除的where子句
StringBuffer toDeletIds = new StringBuffer("(");
for (int i = 0; i < audioIds.length; i++) {
toDeletIds.append(audioIds[i] + ",");
}
toDeletIds.setCharAt(toDeletIds.length() - 1, ')');
Log.i(TAG, "toDeletIds in Members:" + toDeletIds);
// 从Members表中移除记录
Uri uri = Playlists.Members.getContentUri("external", playlistId);
deleteRowCount = resolver.delete(uri, Playlists.Members.AUDIO_ID
+ " in " + toDeletIds, null);
if (deleteRowCount > 0) {
isRemoved = true;
}
Log.i(TAG, "deleted row count in Members:" + deleteRowCount);
return isRemoved;
}
/**
* 获取播放列表里的歌曲数目
*
* @param resolver
* Context的ContentResolver实例
* @param playlistId
* 播放列表的ID
*/
public static int getPlaylistMemberCount(ContentResolver resolver,
int playlistId) {
int result = 0;
Uri uri = Playlists.Members.getContentUri("external", playlistId);
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
result = cursor.getCount();
cursor.close();
}
Log.i(TAG, "members count of the playlist(" + playlistId + "):"
+ result);
return result;
}
/**
* 删除指定路径的文件
*
* @return 删除成功返回true, 删除失败false.
*/
public static boolean deleteFile(String path) {
boolean isDeleted = false;
File file = new File(path);
if (file.exists()) {
isDeleted = file.delete();
}
Log.i(TAG, "delete file " + isDeleted + ":<" + path + ">");
return isDeleted;
}
/**
* 批量删除指定文件
*
* @param 要删除的文件路径数组
* @return 路径数组不为空即返回true
*/
public static boolean deleteFiles(String[] paths) {
if (paths == null) {
return false;
}
for (int i = 0; i < paths.length; i++) {
if (!deleteFile(paths[i])) {
Log.i(TAG, "delete file failed:<" + paths[i] + ">");
}
}
return true;
}
/**
* 从数据库中移除指定的音频
*
* @return 移除成功返回true, 删除失败false.
*/
public static boolean removeTrackFromDatabase(ContentResolver resolver,
long[] audioIds) {
if (audioIds == null) {
return false;
}
boolean isRemoved = false;
// 将整型数组变成(1,2,3,4,5)的格式,作为稍后的数据库删除的where子句
StringBuffer toRemoveIds = new StringBuffer("(");
for (int i = 0; i < audioIds.length; i++) {
toRemoveIds.append(audioIds[i] + ",");
}
toRemoveIds.setCharAt(toRemoveIds.length() - 1, ')');
Log.i(TAG, "toRemoveIds from database:" + toRemoveIds);
// 从数据库中移除音频记录
int deleteRowCount = resolver.delete(Media.EXTERNAL_CONTENT_URI,
Media._ID + " in " + toRemoveIds, null);
if (deleteRowCount > 0) {
isRemoved = true;
}
Log.i(TAG, "count of removed track from database :" + deleteRowCount);
return isRemoved;
}
}