java - 电视提供商 Delete 不适用于 where 子句
问题描述
我正在尝试通过 JobService asynctaks 删除我的应用在 TV.db 中插入的一些频道。
每次我在删除时遇到安全异常。
Process: com.app, PID: 7026
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.SecurityException: Selection not allowed for content://android.media.tv/channel?input=<My package>%2F.live.TvInputService&browsable_only=false
at android.os.Parcel.readException(Parcel.java:1574)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.delete(ContentProviderNative.java:544)
at android.content.ContentResolver.delete(ContentResolver.java:1299)
at com.TvContractUtills.updateChannelsWithGraceNote(TvContractUtills.java:173)
at com.EpgUpdateTask.doInBackground(EpgUpdateTask.java:48)
at com.EpgUpdateTask.doInBackground(EpgUpdateTask.java:11)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
这行代码导致上述错误
resolver.delete(channelsUri,TvContract.Channels._ID+ " in ("+getListOfIds(availableChannelMap) +" )" , null);
availableChannelMap 返回以逗号分隔的频道 ID 列表。
当我将 where 子句保持为空时,相同的代码有效。
resolver.delete(channelsUri,null , null);
知道为什么会这样。
解决方案
要删除频道,您需要ContentResolver
像这样调用
context.contentResolver.delete(TvContractCompat.buildChannelUri(channelId), null, null)
如果要删除多个频道,请将其放入循环中。我不确定这是否是正确的方法。我在providers
API 中看不到任何可用的批量删除方法。它虽然有效。
推荐阅读
- sql-server - 在 SSIS 中设置与 Oracle 连接管理器的连接时出错
- javascript - 无法使用异步函数获得不和谐的机器人响应。无法弄清楚出了什么问题
- sumologic - Sumologic 和搜索查询中的两个聚合
- c# - 来自.Net Core 3.1 上的 PUT 方法的无法解释的 401 响应
- c++ - 如何在 Visual Studio 中重新定义(覆盖)C++ __DATE__ 和 __TIME__ 预定义宏?
- python - 如何在 django rest 框架中找到 1 个用户和其他用户之间的距离
- google-apps-script - 条件过滤 - 谷歌表格
- javascript - switchOff/switchOn twilio 无法按预期工作
- angular - Angular 中的单元测试 Http 调用
- flutter - Flutter CRUD 模型与提供者