Как удалить только одну строку, когда есть два совпадения с Android Contentresolver

В моем музыкальном проигрывателе список воспроизведения может содержать две одинаковые песни (пользователь добавляет одну и ту же песню два раза). Допустим, песня, которая 2 раза находится в Плейлисте, имеет id 7664. При удалении этой песни из Плейлиста ContentResolver.delete(URI_OF_PLAYLIST, "audio_id=7664", null); удаляет оба совпадения. Итак, как мне удалить только одно совпадение?

Заранее спасибо!


person the_dani    schedule 08.01.2017    source источник
comment
Я не могу проверить это сам, но я думаю, что rowid (или это) в качестве критерия выбора может быть полезным.   -  person SME_Dev    schedule 09.01.2017


Ответы (2)


Вот как я это делаю в своем приложении New Playlist Manager:

шаг 1: создайте массив с идентификаторами аудио

шаг 2: во время цикла вокруг этого используйте функцию .lastindex(), чтобы определить, существует ли он где-либо еще. (иначе значение должно совпадать с позицией)

шаг 3: если найдено, удалите из массива аудио идентификаторов, установив для него значение null (вы не хотите изменять его размер) и удалите из плейлиста

шаг 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();
    }
}
person Theo    schedule 09.01.2017
comment
Спасибо, но я не понимаю, почему теперь ContentResolver не должен удалять обе песни? Идентификаторы идентичны и находятся в одной таблице, поэтому он снова удалит обе песни... - person the_dani; 09.01.2017
comment
Можете ли вы опубликовать, как вы переупорядочиваете PlayOrder? И является ли порядок воспроизведения (если он изменен) индексом строки + 1? - person the_dani; 11.01.2017
comment
В ответ на ваш первый комментарий помните, что я удаляю int _id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members._ID)), который отличается от audio_id - person Theo; 11.01.2017
comment
Окей, большое спасибо, я забыл, что в Playlist.Members AUDIO_ID !=_ID! - person the_dani; 11.01.2017

Чтобы изменить порядок плейлиста:

      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();
    }
}
person Theo    schedule 11.01.2017
comment
the_dani, если это помогло вам, возможно, вы можете проголосовать за ответы? - person Theo; 12.01.2017