package com.wm.remusic.provider; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.wm.remusic.MainApplication; import com.wm.remusic.info.MusicInfo; import com.wm.remusic.service.MusicTrack; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.MusicUtils; import java.util.ArrayList; /** * Created by wm on 2016/3/3. */ public class PlaylistsManager { private static PlaylistsManager sInstance = null; private MusicDB mMusicDatabase = null; private long favPlaylistId = IConstants.FAV_PLAYLIST; public PlaylistsManager(final Context context) { mMusicDatabase = MusicDB.getInstance(context); } public static final synchronized PlaylistsManager getInstance(final Context context) { if (sInstance == null) { sInstance = new PlaylistsManager(context.getApplicationContext()); } return sInstance; } //建立播放列表表设置播放列表id和歌曲id为复合主键 public void onCreate(final SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + PlaylistsColumns.NAME + " (" + PlaylistsColumns.PLAYLIST_ID + " LONG NOT NULL," + PlaylistsColumns.TRACK_ID + " LONG NOT NULL," + PlaylistsColumns.TRACK_NAME + " CHAR NOT NULL," + PlaylistsColumns.ALBUM_ID + " LONG," + PlaylistsColumns.ALBUM_NAME + " CHAR," + PlaylistsColumns.ALBUM_ART + " CHAR," + PlaylistsColumns.ARTIST_ID + " LONG," + PlaylistsColumns.ARTIST_NAME + " CHAR," + PlaylistsColumns.IS_LOCAL + " BOOLEAN ," + PlaylistsColumns.PATH + " CHAR," + PlaylistsColumns.TRACK_ORDER + " LONG NOT NULL, primary key ( " + PlaylistsColumns.PLAYLIST_ID + ", " + PlaylistsColumns.TRACK_ID + "));"); } public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + PlaylistsColumns.NAME); onCreate(db); } public synchronized void insert(Context context, long playlistid, long id, int order) { ArrayList<MusicTrack> m = getPlaylist(playlistid); for (int i = 0; i < m.size(); i++) { if (m.get(i).mId == id) return; } final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); try { ContentValues values = new ContentValues(3); values.put(PlaylistsColumns.PLAYLIST_ID, playlistid); values.put(PlaylistsColumns.TRACK_ID, id); values.put(PlaylistsColumns.TRACK_ORDER, getPlaylist(playlistid).size()); database.insert(PlaylistsColumns.NAME, null, values); database.setTransactionSuccessful(); } finally { database.endTransaction(); } PlaylistInfo playlistInfo = PlaylistInfo.getInstance(context); playlistInfo.update(playlistid, getPlaylist(playlistid).size()); } public synchronized void insertMusic(Context context, long playlistid, MusicInfo info) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); try { ContentValues values = new ContentValues(11); values.put(PlaylistsColumns.PLAYLIST_ID, playlistid); values.put(PlaylistsColumns.TRACK_ID, info.songId); values.put(PlaylistsColumns.TRACK_ORDER, getPlaylist(playlistid).size()); values.put(PlaylistsColumns.TRACK_NAME, info.musicName); values.put(PlaylistsColumns.ALBUM_ID, info.albumId); values.put(PlaylistsColumns.ALBUM_NAME, info.albumName); values.put(PlaylistsColumns.ALBUM_ART, info.albumData); values.put(PlaylistsColumns.ARTIST_NAME, info.artist); values.put(PlaylistsColumns.ARTIST_ID, info.artistId); values.put(PlaylistsColumns.PATH, info.data); values.put(PlaylistsColumns.IS_LOCAL, info.islocal); database.insertWithOnConflict(PlaylistsColumns.NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); database.setTransactionSuccessful(); } finally { database.endTransaction(); } PlaylistInfo playlistInfo = PlaylistInfo.getInstance(context); String albumart = info.albumData; if (info.islocal) { if (albumart.equals(MusicUtils.getAlbumdata(MainApplication.context, info.songId))) { playlistInfo.update(playlistid, getPlaylist(playlistid).size(), info.albumData); } else { playlistInfo.update(playlistid, getPlaylist(playlistid).size()); } } else if (!albumart.isEmpty()) { playlistInfo.update(playlistid, getPlaylist(playlistid).size(), info.albumData); } else { playlistInfo.update(playlistid, getPlaylist(playlistid).size()); } } public synchronized void insertLists(Context context, long playlistid, ArrayList<MusicInfo> musicInfos) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); int len = musicInfos.size(); try { for (int i = 0; i < len; i++) { MusicInfo info = musicInfos.get(i); ContentValues values = new ContentValues(11); values.put(PlaylistsColumns.PLAYLIST_ID, playlistid); values.put(PlaylistsColumns.TRACK_ID, info.songId); values.put(PlaylistsColumns.TRACK_ORDER, getPlaylist(playlistid).size()); values.put(PlaylistsColumns.TRACK_NAME, info.musicName); values.put(PlaylistsColumns.ALBUM_ID, info.albumId); values.put(PlaylistsColumns.ALBUM_NAME, info.albumName); values.put(PlaylistsColumns.ALBUM_ART, info.albumData); values.put(PlaylistsColumns.ARTIST_NAME, info.artist); values.put(PlaylistsColumns.ARTIST_ID, info.artistId); values.put(PlaylistsColumns.PATH, info.data); values.put(PlaylistsColumns.IS_LOCAL, info.islocal); database.insertWithOnConflict(PlaylistsColumns.NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); } database.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { database.endTransaction(); } PlaylistInfo playlistInfo = PlaylistInfo.getInstance(context); String albumart = null; for (int i = len - 1; i >= 0; i--) { MusicInfo info = musicInfos.get(i); albumart = info.albumData; if (info.islocal) { String art = MusicUtils.getAlbumdata(MainApplication.context, info.songId); if (art != null) { break; } else { albumart = null; } } else if (!albumart.isEmpty()) { break; } } if (albumart != null) { playlistInfo.update(playlistid, getPlaylist(playlistid).size(), albumart); } else { playlistInfo.update(playlistid, getPlaylist(playlistid).size()); } } public synchronized void update(long playlistid, long id, int order) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); try { ContentValues values = new ContentValues(1); values.put(PlaylistsColumns.TRACK_ORDER, order); database.update(PlaylistsColumns.NAME, values, PlaylistsColumns.PLAYLIST_ID + " = ?" + " AND " + PlaylistsColumns.TRACK_ID + " = ?", new String[]{playlistid + "", id + ""}); database.setTransactionSuccessful(); } finally { database.endTransaction(); } } public synchronized boolean getFav(long id) { Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.PLAYLIST_ID + " = ?" + " AND " + PlaylistsColumns.TRACK_ID + " = ?", new String[]{favPlaylistId + "", id + ""}, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { return true; } return false; } finally { if (cursor != null) { cursor.close(); cursor = null; } } } public synchronized void update(long playlistid, long[] ids, int[] order) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.beginTransaction(); try { for (int i = 0; i < order.length; i++) { ContentValues values = new ContentValues(1); values.put(PlaylistsColumns.TRACK_ORDER, order[i]); database.update(PlaylistsColumns.NAME, values, PlaylistsColumns.PLAYLIST_ID + " = ?" + " AND " + PlaylistsColumns.TRACK_ID + " = ?", new String[]{playlistid + "", ids[i] + ""}); } database.setTransactionSuccessful(); } finally { database.endTransaction(); } } public void removeItem(Context context, final long playlistId, long songId) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.delete(PlaylistsColumns.NAME, PlaylistsColumns.PLAYLIST_ID + " = ?" + " AND " + PlaylistsColumns.TRACK_ID + " = ?", new String[]{ String.valueOf(playlistId), String.valueOf(songId) }); PlaylistInfo playlistInfo = PlaylistInfo.getInstance(context); playlistInfo.update(playlistId, getPlaylist(playlistId).size()); } public void delete(final long PlaylistId) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.delete(PlaylistsColumns.NAME, PlaylistsColumns.PLAYLIST_ID + " = ?", new String[] {String.valueOf(PlaylistId)}); } public synchronized void deleteMusicInfo(Context context, final long playlistid, final long musicid) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.PLAYLIST_ID + " = ? and" + PlaylistsColumns.TRACK_ID + " = ?", new String[]{ String.valueOf(playlistid), String.valueOf(musicid) }, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { long[] deletedPlaylistIds = new long[cursor.getCount()]; int i = 0; do { deletedPlaylistIds[i] = cursor.getLong(0); i++; } while (cursor.moveToNext()); PlaylistInfo.getInstance(context).updatePlaylistMusicCount(deletedPlaylistIds); } } finally { if (cursor != null) { cursor.close(); cursor = null; } } } //删除播放列表中的记录的音乐 ,删除本地文件时调用 public synchronized void deleteMusic(Context context, final long musicId) { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.TRACK_ID + " = " + String.valueOf(musicId), null, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { long[] deletedPlaylistIds = new long[cursor.getCount()]; int i = 0; do { deletedPlaylistIds[i] = cursor.getLong(0); i++; } while (cursor.moveToNext()); PlaylistInfo.getInstance(context).updatePlaylistMusicCount(deletedPlaylistIds); } } finally { if (cursor != null) { cursor.close(); cursor = null; } } database.delete(PlaylistsColumns.NAME, PlaylistsColumns.TRACK_ID + " = ?", new String[] {String.valueOf(musicId)}); } public void deleteAll() { final SQLiteDatabase database = mMusicDatabase.getWritableDatabase(); database.delete(PlaylistsColumns.NAME, null, null); } public long[] getPlaylistIds(final long playlistid) { long[] results = null; Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.PLAYLIST_ID + " = " + String.valueOf(playlistid), null, null, null, PlaylistsColumns.TRACK_ORDER + " ASC ", null); if (cursor != null) { int len = cursor.getCount(); results = new long[len]; if (cursor.moveToFirst()) { for (int i = 0; i < len; i++) { results[i] = cursor.getLong(1); cursor.moveToNext(); } } } return results; } finally { if (cursor != null) { cursor.close(); cursor = null; } } } public ArrayList<MusicTrack> getPlaylist(final long playlistid) { ArrayList<MusicTrack> results = new ArrayList<>(); Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.PLAYLIST_ID + " = " + String.valueOf(playlistid), null, null, null, PlaylistsColumns.TRACK_ORDER + " ASC ", null); if (cursor != null && cursor.moveToFirst()) { results.ensureCapacity(cursor.getCount()); do { results.add(new MusicTrack(cursor.getLong(1), cursor.getInt(0))); } while (cursor.moveToNext()); } return results; } finally { if (cursor != null) { cursor.close(); cursor = null; } } } public ArrayList<MusicInfo> getMusicInfos(final long playlistid) { ArrayList<MusicInfo> results = new ArrayList<>(); Cursor cursor = null; try { cursor = mMusicDatabase.getReadableDatabase().query(PlaylistsColumns.NAME, null, PlaylistsColumns.PLAYLIST_ID + " = " + String.valueOf(playlistid), null, null, null, PlaylistsColumns.TRACK_ORDER + " ASC ", null); if (cursor != null && cursor.moveToFirst()) { results.ensureCapacity(cursor.getCount()); do { MusicInfo info = new MusicInfo(); info.songId = cursor.getLong(1); info.musicName = cursor.getString(2); info.albumId = cursor.getInt(3); info.albumName = cursor.getString(4); info.albumData = cursor.getString(5); info.artistId = cursor.getLong(6); info.artist = cursor.getString(7); info.islocal = cursor.getInt(8) > 0; results.add(info); } while (cursor.moveToNext()); } return results; } finally { if (cursor != null) { cursor.close(); cursor = null; } } } public interface PlaylistsColumns { /* Table name */ String NAME = "playlists"; /* Album IDs column */ String PLAYLIST_ID = "playlist_id"; /* Time played column */ String TRACK_ID = "track_id"; String TRACK_ORDER = "track_order"; String TRACK_NAME = "track_name"; String ARTIST_NAME = "artist_name"; String ARTIST_ID = "artist_id"; String ALBUM_NAME = "album_name"; String ALBUM_ID = "album_id"; String IS_LOCAL = "is_local"; String IS_FAV = "is_fav"; String PATH = "path"; String ALBUM_ART = "album_art"; } }