首页 > 解决方案 > Android:更新另一个应用程序中使用的 SQLite 表

问题描述

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

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

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

标签: androidandroid-contentproviderandroid-contentresolver

解决方案


我最终做的是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) {
    }
}

推荐阅读