我的应用程序的db在Feed
对象和Tweet
对象之间存在多对多的关系。这是为了跟踪每条推文所属的Feed。如果您熟悉Twitter,请想象主要Feed,列表Feed,用户个人资料Feed等。
如何使用NSPredicate
进行查询以获取特定Tweet
中存在的Feed
列表(相反,获取Feeds
列表那个Tweet
存在吗?似乎反向关系的查询在Realm中不起作用,那么我的选择是什么?
答案 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
虽然不推荐(因为它增加了额外的工作),但不允许这样做。
祝你好运!