我正在构建一个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)
);
然后,为了能够获取Tag
的所有Content
(或相反地,标记的内容),我创建了一个视图:
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)
所有{{1将使用新的Content
信息更新该标记。
据我所知,内容URI也会通知URI的后代,因此我似乎只能在基URI上通知所有内容(并且每条内容都会更新)。但如果只有少量内容发生变化,那可能效率低下。
有更好的方法来执行通知吗?
答案 0 :(得分:1)
所以这就是我在类似情况下所做的并且工作得很好:
我有一个表名为Messages和MessagesProvider。我有一个像你的视图和它的内容提供者名为HistoryProvider。在每个方法delete
,insert
和update
结束时的MessageProvider中,应该有一行您要通知此内容提供者的内容观察者,有些事情如下:< / p>
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);
那就是它!因此,如果您的内容提供商写得正确,它应该像魅力一样工作。