我正在构建一个 Android 应用程序,其中包含 Content
和 Tag
的 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 中,在每个方法 delete
、insert
和 update
的末尾,应该有一行内容通知内容观察者内容提供者,像这样的东西:
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/