android - Android:更新另一个应用程序中使用的 SQLite 表
问题描述
我编写了一个对 Poweramp 播放列表进行排序的应用程序,它运行良好。我遇到的唯一问题是性能,我认为这是因为我getContentResolver().update
在每一行上都调用了。理想情况下,我希望能够使用 SQLite 事务。 applyBatch
并且bulkInsert
不起作用,因为我需要在每行更新时都有一个 WHERE 子句——我基本上必须更新一个索引表,它有多个播放列表及其歌曲。
据我了解,我将无法通过 SQLite 直接访问 Poweramp 的数据库,因为我已经读过我需要具有相同的应用程序签名或其他东西?也许有人可以澄清这一点。似乎我唯一的希望是可能覆盖 ContentResolver 的 applyBatch 方法或添加我自己的(来自这个线程)?虽然,我不完全确定如何覆盖它......该线程中的代码似乎已经以某种方式覆盖了该类。我也不认为它使用外部数据库。
关于我应该看哪里的任何提示,或者如果那里已经有答案,那就太好了。
解决方案
我最终做的是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) {
}
}
推荐阅读
- c++ - boost text 序列化版本(15 vs 18)
- c# - ModelState.IsValid 为假但应该为真
- python - Google Colab 上熊猫的 ANSI 编码?
- java - 如何将 Web 驱动程序实例传递给另一个类的方法
- javascript - 一堆单选按钮,并希望在其中一个上启用切换
- ios - 动画立即结束并且不运行 UIView.animate
- timeout - Expect 下的超时命令未按预期工作
- javascript - 如何记录此函数构造函数值?
- java - JPA:在多对多和多对一关系中删除外键?
- regex - 正则表达式:不是所有的空白,但允许某些字符,有限制