Java 当android Contentresolver有两个匹配项时,如何仅删除一行
在我的音乐播放器中,一个播放列表可能包含两首相同的歌曲(用户添加同一首歌曲两次)。 假设播放列表中出现2次的歌曲id为7664。 从播放列表中删除此歌曲时,Java 当android Contentresolver有两个匹配项时,如何仅删除一行,java,android,android-contentprovider,mediastore,playlists,Java,Android,Android Contentprovider,Mediastore,Playlists,在我的音乐播放器中,一个播放列表可能包含两首相同的歌曲(用户添加同一首歌曲两次)。 假设播放列表中出现2次的歌曲id为7664。 从播放列表中删除此歌曲时,ContentResolver.delete(播放列表的URI_,“audio_id=7664”,null)删除两个匹配项。 那么,如何只删除一个匹配项 提前谢谢 我在我的应用程序New Playlist Manager中就是这样做的: 步骤1:使用音频ID创建阵列 步骤2:在循环此过程中,使用.lastindex()函数确定它是否存在于其他
ContentResolver.delete(播放列表的URI_,“audio_id=7664”,null)代码>删除两个匹配项。
那么,如何只删除一个匹配项
提前谢谢 我在我的应用程序New Playlist Manager中就是这样做的:
步骤1:使用音频ID创建阵列
步骤2:在循环此过程中,使用.lastindex()函数确定它是否存在于其他位置。(否则该值应与位置相同)
步骤3:如果找到,通过将音频ID数组设置为null(您不想更改其大小)从音频ID数组中删除,并从播放列表中删除
步骤4:重新排列播放顺序
public void dedupe_playlist(Context context, long playlist_id) {
Cursor cursor = plist.getPlaylistTracks(context, playlist_id);
ArrayList<String> audio_ids = new ArrayList<>();
// build up the array with audio_id's
int i = 0;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String audio_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
audio_ids.add(audio_id);
}
i = 0;
int duplicates = i;
boolean success = false;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String audio_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
duplicates = audio_ids.lastIndexOf(audio_id);
if (duplicates > i) {
success = true;
cursor.moveToPosition(duplicates);
int _id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members._ID));
removePlaylistTrack(context, playlist_id, _id);
audio_ids.set(duplicates, null);
cursor.moveToPosition(i - 1); // move back to test again
} else {
i++;
}
}
if (success) {
renumber_playorder(context, playlist_id);
}
try {
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void removePlaylistTrack(Context context, long selectedplaylist,
int _id) {
ContentResolver resolver = context.getContentResolver();
Uri newuri = MediaStore.Audio.Playlists.Members.getContentUri(
"external", selectedplaylist);
try {
resolver.delete(newuri, MediaStore.Audio.Playlists.Members._ID + " = " + _id, null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void dedupe\u播放列表(上下文上下文,长播放列表\u id){
Cursor Cursor=plist.getplaylatracks(上下文、播放列表\u id);
ArrayList audio_id=新建ArrayList();
//使用音频id构建阵列
int i=0;
对于(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
String audio_id=cursor.getString(cursor.getColumnIndex(MediaStore.audio.Playlists.Members.audio_id));
音频标识。添加(音频标识);
}
i=0;
int duplicates=i;
布尔成功=假;
对于(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
String audio_id=cursor.getString(cursor.getColumnIndex(MediaStore.audio.Playlists.Members.audio_id));
副本=音频id.lastIndexOf(音频id);
如果(重复项>i){
成功=真实;
光标移动位置(重复);
int _id=cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.u id));
移除播放曲目(上下文、播放列表\u id、\u id);
音频标识集(重复,空);
cursor.moveToPosition(i-1);//再次移回测试
}否则{
i++;
}
}
如果(成功){
重新编号播放顺序(上下文、播放列表id);
}
试一试{
cursor.close();
}捕获(例外e){
e、 printStackTrace();
}
}
public void RemovePlayTrack(上下文、长选定播放列表、,
int_id){
ContentResolver解析器=context.getContentResolver();
Uri newuri=MediaStore.Audio.Playlists.Members.getContentUri(
“外部”,选择播放列表);
试一试{
解析程序.delete(newuri,MediaStore.Audio.Playlists.Members.\u ID+“=”+\u ID,null);
}捕获(例外e){
e、 printStackTrace();
}
}
要重新排列播放列表,请执行以下操作:
public void renumber_playorder(Context context, long playlist_id) {
Cursor cursor = getPlaylistTracks(context, playlist_id);
Uri newuri = MediaStore.Audio.Playlists.Members.getContentUri(
"external", playlist_id);
ContentResolver resolver = context.getContentResolver();
ContentValues values = new ContentValues();
int i = 0;
if (cursor != null && cursor.moveToFirst()) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String _id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members._ID));
String[] selection = {_id};
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, i);
resolver.update(newuri, values, MediaStore.Audio.Playlists.Members._ID + " =? ", selection);
i++;
}
cursor.close();
}
}
我自己无法测试,但我认为(或)作为选择标准可能会有所帮助。谢谢,但我不明白为什么contentresolver现在不应该删除这两首歌曲?id是相同的,并且在同一个表中,因此它将再次删除这两首歌曲…您可以发布如何重新排列播放顺序吗?播放顺序(如果重新排序)是行+1的索引吗?作为对您第一条评论的回应,请记住我删除了int _id=cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.id)),这与Audio _id键不同,非常感谢,我忘记了Playlist.Members Audio _id=_身份证件_dani,如果这对你有帮助,也许你可以投票支持这些答复?