Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当android Contentresolver有两个匹配项时,如何仅删除一行_Java_Android_Android Contentprovider_Mediastore_Playlists - Fatal编程技术网

Java 当android Contentresolver有两个匹配项时,如何仅删除一行

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()函数确定它是否存在于其他

在我的音乐播放器中,一个播放列表可能包含两首相同的歌曲(用户添加同一首歌曲两次)。 假设播放列表中出现2次的歌曲id为7664。 从播放列表中删除此歌曲时,
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,如果这对你有帮助,也许你可以投票支持这些答复?