2017-01-08 23 views
0

私の音楽プレーヤーでは、プレイリストに2つの同じ曲が含まれている可能性があります。 プレイリストの2倍の曲がid 7664であるとしましょう。 この曲をプレイリストから削除すると、ContentResolver.delete(URI_OF_PLAYLIST, "audio_id=7664", null);は両方のマッチを削除します。 どうすれば1つの試合だけを削除できますか?アンドロイドとの一致が2つある場合にのみ1行を削除する方法Contentresolver

ありがとうございます!

+0

私はそれを自分自身をテストすることはできませんが、私はその[ROWID]だと思う(http://stackoverflow.com/questions/15570096/sqlite-get-rowid)(または[this](http: //stackoverflow.com/questions/6500445/rowid-in-sqlite3-and-android))を参考にしてください。 –

答えて

0

これは私が私のアプリ新規プレイリストマネージャでそれを行う方法です。

ステップ1:オーディオのIDを持つ配列を作成

ステップ2:この周りをループしながら、に.lastindex()関数を使用します他の場所に存在するかどうかを判断する。 (それ以外の場合は値が位置と同じでなければなりません)

ステップ3:見つかった場合は、ヌルに設定することで、オーディオのIds配列から削除(あなたはそのサイズを変更したくない)、プレイリストから

ステップを削除4:プレイリストを並べ替えるには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

ありがとうございますが、私はcontentresolverがなぜ今の両方の曲を削除すべきでないのか理解できません。 IDは同一で同じテーブルにあるため、両方の曲が再度削除されます... –

+0

PlayOrderの並べ替えの方法を投稿できますか?プレイ順序(並べ替えた場合)は行+1のインデックスですか? –

+0

あなたの最初のコメントに応じて、私はaudio_id – Theo

0

を並べ替える:

 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、これはおそらくあなたが返信を投票することができますか? – Theo

関連する問題