如何使用多对多sqlite关系为notifyChange设计内容uri



我正在构建一个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的能力(或者相反,一个标签的内容),我创建了一个视图:

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, insertupdate方法的末尾应该有一行,您正在通知该内容提供程序上的内容观察者,类似于:

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);

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

最新更新