领域多对多查询(反向也是!)

时间:2016-02-11 16:28:31

标签: ios swift nspredicate realm

我的应用程序的db在Feed对象和Tweet对象之间存在多对多的关系。这是为了跟踪每条推文所属的Feed。如果您熟悉Twitter,请想象主要Feed,列表Feed,用户个人资料Feed等。

如何使用NSPredicate进行查询以获取特定Tweet中存在的Feed列表(相反,获取Feeds列表那个Tweet存在吗?似乎反向关系的查询在Realm中不起作用,那么我的选择是什么?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么这部分文档应该会有所帮助:

  

反向关系链接是单向的。所以,如果一个多人   属性Person.dogs链接到Dog实例和to-one属性   Dog.owner链接到Person,这些链接是独立的   另一个。将狗添加到Person实例的dog属性中,不会   自动将狗的所有者属性设置为此Person。因为   手动同步关系对是容易出错的,复杂的   并重复信息,Realm公开了一个API来检索反向链接   如下所述。

     

使用反向关系,您可以获得链接到a的所有对象   通过特定属性给定对象。例如,打电话   Dog实例上的Object()。linksObjects(_:forProperty :)将返回   链接到调用实例的指定类的所有对象   具有指定的属性。

我猜你可以这样做:

//assuming your Tweet object has a property like "let feeds = List<Feed>()"
someTweet.linkingObjects(Feed.self, forProperty: "feeds") //should return feeds your Tweet is in

但我仍然不认为我清楚地理解你的问题。从我的角度来看你的第一个要求:

  

获取特定Feed中存在的推文列表

应该有一个简单的解决方案,例如在Feed对象中添加属性,如:

let tweets = List<Tweet>()

我希望你能进一步澄清你的情况。

答案 1 :(得分:0)

我想知道是否有可能简化模型,因此不需要多对多。

我对Twitter的理解是推文并非由任何Feed所拥有。它们只是存在于平台上,并由任意数量的Feed引用,但实际上并不属于任何特定的Feed。

所以这样的模型设置应该是合适的:

class Tweet : Object {

}

class Feed : Object {
   let tweets = List<Tweet>()
}

您可以对Tweet执行反向查找,以查看是否有任何目前可见的Feed,您只需使用tweets对象的Feed属性即可看看他们正在展示哪些推文

由于Realm的linkingObjects反向查找方法只返回一个标准的Swift数组,如果你想进一步过滤,你可以只使用系统API(如filter或{{1} })进一步完善它。

否则,如果你确实希望能够以两种方式使用Realm的NSPredicate过滤系统,那么,就像它一样混乱,你需要手动让每个模型链接到另一个的列表:

map

虽然不推荐(因为它增加了额外的工作),但不允许这样做。

祝你好运!