我编写了一个对Poweramp播放列表进行排序的应用程序,它可以正常运行。我遇到的唯一问题是性能,我认为这是因为我在每一行上都调用getContentResolver().update
。理想情况下,我很希望能够使用SQLite事务。 applyBatch
和bulkInsert
不起作用,因为我需要在每次更新行时都有一个WHERE子句-本质上,我必须更新一个索引表,该表具有多个播放列表及其歌曲。
据我了解,我将无法直接通过SQLite访问Poweramp的数据库,因为我已经读过我需要具有相同的应用程序签名或其他内容?也许有人可以澄清这一点。似乎我唯一的希望是覆盖ContentResolver的applyBatch方法或添加我自己的方法(来自this thread)?虽然,我不太确定该如何重写...该线程中的代码似乎已经以某种方式覆盖了该类。我也不认为它使用外部数据库。
关于我应该去哪里看的任何提示,或者如果已经有答案了,那就太好了。
答案 0 :(得分:0)
我最终要做的是使用ContentProviderOperation
和getContentResolver().applyBatch
(由于@MatPag提供了可能的建议)...现在运行速度快了很多,但我没有收到等待消息了。 applyBatch
的关键部分是您必须将其包装在try..catch中,该错误通过报告的Android Studio错误并不明显。这是最终的代码:
Cursor songs = createPlaylistCursor(sort);
if (songs.moveToFirst()) {
int i = 0;
Uri playListUri = getPlaylistUri();
ArrayList<ContentProviderOperation> cs = new ArrayList<ContentProviderOperation>();
do {
cs.add(ContentProviderOperation.newUpdate(playListUri)
.withSelection("folder_file_id=" + songs.getInt(songs.getColumnIndexOrThrow("folder_files._id")), null)
.withValue("sort", i++)
.build());
} while (songs.moveToNext());
try {
getContentResolver().applyBatch("com.maxmpz.audioplayer.data", cs);
}
catch (Exception e) {
}
}