gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:43:45 25 4
gpt4 key购买 nike

我正在构建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com