0

Dans mon lecteur de musique, une liste de lecture peut contenir deux chansons identiques (l'utilisateur ajoute la même chanson deux fois). Disons que la chanson qui est 2 fois dans la Playlist a l'ID 7664. En supprimant cette chanson de la playlist, ContentResolver.delete(URI_OF_PLAYLIST, "audio_id=7664", null); supprime les deux matchs. Alors, comment est-ce que je supprime seulement un match?Comment supprimer seulement une ligne quand il y a deux correspondances avec android Contentresolver

Merci d'avance!

+0

Je ne peux pas tester moi-même, mais je pense que [rowid] (http://stackoverflow.com/questions/15570096/sqlite-get-rowid) (ou [ceci] (http: //stackoverflow.com/questions/6500445/rowid-in-sqlite3-and-android)) comme critère de sélection pourrait être utile. –

Répondre

0

Voici comment je le fais dans mon application New Playlist Manager:

étape 1: créer un tableau avec Ids audio

étape 2: tout en boucle autour, utilisez la fonction .lastindex() à déterminer s'il existe ailleurs. (Sinon, la valeur doit être la même que la position)

étape 3: si trouvé, retirer du tableau Ids audio en réglant à null (vous ne voulez pas changer sa taille) et de supprimer la liste de lecture

étape 4: réorganiser la playorder

 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(); 
    } 
} 
+0

Merci, mais je ne comprends pas pourquoi le contentresolver ne devrait pas supprimer les deux chansons maintenant? Les ID sont identiques et dans la même table donc il va supprimer les deux chansons à nouveau ... –

+0

Pouvez-vous poster comment vous réorganisez le PlayOrder? Et l'ordre de lecture (s'il est réorganisé) est-il l'indice de la ligne + 1? –

+0

En réponse à votre premier commentaire, rappelez-vous que je supprime l'int _id = cursor.getInt (cursor.getColumnIndex (MediaStore.Audio.Playlists.Members._ID)), qui est différent de l'audio_id – Theo

0

Pour réordonner une playlist:

 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(); 
    } 
} 
+0

the_dani, si cela vous a peut-être aidé, vous pouvez voter pour les réponses? – Theo