我正在构建一个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
的能力(或者相反,一个标签的内容),我创建了一个视图:
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
表中的一个项目上执行UPDATE,那么当我调用notifyChange(uri)
时,所有带有该标签的Content
将用新的Tag
信息更新。
我知道内容URI也会通知URI的后代,所以我似乎可以只通知所有内容的基本URI(并更新每个内容)。但是,如果只有少数内容发生了变化,那么这种方法可能效率低下。
是否有更好的方法来执行通知?
所以这是我在类似的情况下所做的,并且工作得很好:
我有一个名为Messages和MessagesProvider的表。我有一个像你这样的视图,它的内容提供者叫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);
就是这样!因此,如果您的内容提供程序编写正确,它应该像一个魅力。