私の音楽プレーヤーでは、プレイリストに2つの同じ曲が含まれている可能性があります。 プレイリストの2倍の曲がid 7664であるとしましょう。 この曲をプレイリストから削除すると、ContentResolver.delete(URI_OF_PLAYLIST, "audio_id=7664", null);
は両方のマッチを削除します。 どうすれば1つの試合だけを削除できますか?アンドロイドとの一致が2つある場合にのみ1行を削除する方法Contentresolver
ありがとうございます!
私の音楽プレーヤーでは、プレイリストに2つの同じ曲が含まれている可能性があります。 プレイリストの2倍の曲がid 7664であるとしましょう。 この曲をプレイリストから削除すると、ContentResolver.delete(URI_OF_PLAYLIST, "audio_id=7664", null);
は両方のマッチを削除します。 どうすれば1つの試合だけを削除できますか?アンドロイドとの一致が2つある場合にのみ1行を削除する方法Contentresolver
ありがとうございます!
これは私が私のアプリ新規プレイリストマネージャでそれを行う方法です。
ステップ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();
}
}
ありがとうございますが、私はcontentresolverがなぜ今の両方の曲を削除すべきでないのか理解できません。 IDは同一で同じテーブルにあるため、両方の曲が再度削除されます... –
PlayOrderの並べ替えの方法を投稿できますか?プレイ順序(並べ替えた場合)は行+1のインデックスですか? –
あなたの最初のコメントに応じて、私はaudio_id – Theo
を並べ替える:
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();
}
}
the_dani、これはおそらくあなたが返信を投票することができますか? – Theo
私はそれを自分自身をテストすることはできませんが、私はその[ROWID]だと思う(http://stackoverflow.com/questions/15570096/sqlite-get-rowid)(または[this](http: //stackoverflow.com/questions/6500445/rowid-in-sqlite3-and-android))を参考にしてください。 –