android - 如何使用多对多 sqlite 关系为 notifyChange 设计内容 URI?

标签 android sqlite

我正在构建一个 Android 应用程序,其中包含 ContentTag 的 sqlite 表。每个 Content 都可以有一个或多个 Tag,并且一个标签可以附加到一个或多个 Content。为了创建多对多关系,我创建了一个名为 Content_Tag 的 sqlite 表,如下所示:

CREATE TABLE CONTENT_TAG (
  CONTENT_ID STRING NOT NULL,
  TAG_ID STRING NOT NULL,
  CREATED_DATE INTEGER NOT NULL,
  PRIMARY KEY (CONTENT_ID, TAG_ID),
  FOREIGN KEY (CONTENT_ID) REFERENCES CONTENT (_ID),
  FOREIGN KEY (TAG_ID) REFERENCES TAG (_ID)
);

然后,为了提供获取 Content 的所有 Tag 的能力(或者相反,标签的内容),我创建了一个 View :

CREATE VIEW CONTENT_TAG_VIEW AS
SELECT ...
FROM CONTENT_TAG
JOIN CONTENT ON CONTENT_TAG.CONTENT_ID = CONTENT._ID
JOIN TAG ON CONTENT_TAG.TAG_ID = TAG._ID;

现在我想做的是设计我的内容 URI,如果对 Tag 表中的项目执行更新,那么当我调用 notifyChange(uri) 所有带有该标签的Content 都将更新为新的Tag 信息。

我知道内容 URI 也会通知 URI 的后代,所以我似乎可以只通知所有内容的基本 URI(并更新每条内容)。但如果只有几条内容发生变化,那可能效率低下。

有没有更好的方法来执行通知?

最佳答案

所以这是我在类似情况下所做的并且工作得很好:

我有一个名为 Messages 和 MessagesProvider 的表。我有一个像您的 View 及其名为 HistoryProvider 的内容提供者。在 MessageProvider 中,在每个方法 deleteinsertupdate 的末尾,应该有一行内容通知内容观察者内容提供者,像这样的东西:

getContext().getContentResolver().notifyChange(uri, null);

所以我添加了另一行来通知 HistoryProvider 上的内容观察者:

getContext().getContentResolver().notifyChange(HistoryProvider.CONTENT_URI , null);
getContext().getContentResolver().notifyChange(uri, null);

在 MessageProvider 中的 query 方法结束时,我这样做了:

cursor.setNotificationUri(getContext().getContentResolver(), HistoryProvider.CONTENT_URI);
cursor.setNotificationUri(getContext().getContentResolver(), uri);

就是这样!因此,如果您的内容提供程序编写正确,它应该会很有魅力。

关于android - 如何使用多对多 sqlite 关系为 notifyChange 设计内容 URI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389510/

相关文章:

android - 无法安装 APK 托管我自己的 apache 服务器

android - Flutter:任务 ':app:validateSigningRelease' 执行失败。 > keystore 文件未设置用于签名配置发布

sqlite - SQLite的MATCH NONE是什么意思?

c - 如何在sqlite3中限制数据长度

python - Python 或 Bash 或 CLI 中的 SQLite 数据更改通知回调

android - 我无法将两张图片放在布局的中心

android - getDefaultSmsPackage() 在 android 11 中返回 Null

java - android:如何将位图数组合并到一个位图中?

ios - 是否使用 Core Data?

c# - 将值从 SQL 返回到 WPF 表单 - 我做得正确吗?