Android:更新另一个应用程序中使用的SQLite表

时间:2019-01-31 04:57:30

标签: android android-contentprovider android-contentresolver

我编写了一个对Poweramp播放列表进行排序的应用程序,它可以正常运行。我遇到的唯一问题是性能,我认为这是因为我在每一行上都调用getContentResolver().update。理想情况下,我很希望能够使用SQLite事务。 applyBatchbulkInsert不起作用,因为我需要在每次更新行时都有一个WHERE子句-本质上,我必须更新一个索引表,该表具有多个播放列表及其歌曲。

据我了解,我将无法直接通过SQLite访问Poweramp的数据库,因为我已经读过我需要具有相同的应用程序签名或其他内容?也许有人可以澄清这一点。似乎我唯一的希望是覆盖ContentResolver的applyBatch方法或添加我自己的方法(来自this thread)?虽然,我不太确定该如何重写...该线程中的代码似乎已经以某种方式覆盖了该类。我也不认为它使用外部数据库。

关于我应该去哪里看的任何提示,或者如果已经有答案了,那就太好了。

1 个答案:

答案 0 :(得分:0)

我最终要做的是使用ContentProviderOperationgetContentResolver().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) {
    }
}