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

时间:2014-08-19 17:30:14

标签: android sqlite

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

然后,为了能够获取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上通知所有内容(并且每条内容都会更新)。但如果只有少量内容发生变化,那可能效率低下。

有更好的方法来执行通知吗?

1 个答案:

答案 0 :(得分:1)

所以这就是我在类似情况下所做的并且工作得很好:

我有一个表名为Messages和MessagesProvider。我有一个像你的视图和它的内容提供者名为HistoryProvider。在每个方法deleteinsertupdate结束时的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);

那就是它!因此,如果您的内容提供商写得正确,它应该像魅力一样工作。