通过将数组中对象的keypath与swift中的NSPredicate进行比较筛选多对多关系

通过将数组中对象的keypath与swift中的NSPredicate进行比较筛选多对多关系,swift,macos,nspredicate,realm,Swift,Macos,Nspredicate,Realm,我希望你能帮助我。我正在使用Realm作为底层数据库系统构建一个MacOSX应用程序 我的模型如下所示: -砖块:由属性标题和文本组成的文本砖块 -GeneratorBrick:一个多对多关系对象,用于建模Generator、Brick和一些与问题无关的其他数据之间的关系。此对象上的属性称为“brick” -生成器:由一些文本和属性名为“GeneratorBricks”的GeneratorBricks列表组成的配置 在我的应用程序中,我现在有一个生成器对象。这一个包含一组GeneratorBri

我希望你能帮助我。我正在使用Realm作为底层数据库系统构建一个MacOSX应用程序

我的模型如下所示:

-砖块:由属性标题和文本组成的文本砖块

-GeneratorBrick:一个多对多关系对象,用于建模Generator、Brick和一些与问题无关的其他数据之间的关系。此对象上的属性称为“brick”

-生成器:由一些文本和属性名为“GeneratorBricks”的GeneratorBricks列表组成的配置

在我的应用程序中,我现在有一个生成器对象。这一个包含一组GeneratorBrick对象的列表,每个对象本身都有一个砖块和一些其他数据。我在TableView中显示它们。现在,我想显示另一个TableView,其中仅显示当前生成器的TableView中不存在的砖对象。发电机中的砖块我可以通过
generator.generatorBricks[index].brick

在我的应用程序的早期版本中,我通过
var bricks:Results=try加载了我需要的所有Brick对象!Realm().objects(Brick).sorted(“title”).filter(“inGenerator=false”)
但由于我的模型从使用属性“inGenerator”更改为使用另一个模型类“GeneratorBrick”,我需要另一种过滤方法。不幸的是,我不知道如何完成这项任务。我尝试了不同的谓词,如%@中的
generatorBricks“,generator.generatorBricks
,其中属性“generatorBricks”是Brick类中的反向链接属性

也许我正在尝试一些不能通过使用谓词来完成的事情,或者我只是没有足够的谓词经验。也许我是瞎子,因为我更习惯于使用简单的SQL,我会使用如下内容:

create table brick (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  title varchar(255)
);
create table generator (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  title varchar(255)
);

create table generatorbrick (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  brickId INT(6),
  generatorId INT(6)
) 

select * from brick b join generatorbrick gb on b.id = gb.brickid where gb.generatorid is not 123

你了解我的问题吗?你需要更多的信息吗?如果你能给我一个正确方向的提示,我很高兴提供。提前谢谢你。

如果你在传统SQL中使用(昂贵的)连接操作,你应该在(廉价的)图形关系领域中执行:

class Brick: Object {
  dynamic var title = ""
}
class BrickGenerator: Object {
  dynamic var id = 0
  dynamic var title = ""
  dynamic var brick: Brick? = nil
}

let realm = try! Realm()
let brick = realm.objects(BrickGenerator).filter("id != 123").first?.brick
我不能100%确定这是否是您试图模拟的操作,我的印象是,如果我真正理解您试图实现的目标,这些模型可以简化得更多


但要点是领域是一个图形数据库(不是关系数据库),所以链接是本机表示的。试着想想如果模型100%在内存中,普通的旧Swift对象(类/结构)会是什么样子.

我得出的结论是,我想要做的不是简单地用基于图形的领域来实现。至少在不加载所有的砖块、generatorbricks和生成器的情况下,通过迭代所有砖块并检查它们是否是当前生成器的一部分来进行手动比较

我需要像这样的东西

选择砖块。*
砖头
在brick.id=generatorbrick.brickId上连接generatorbrick
在generator.id=generatorbrick.generatorId上连接生成器

其中generator.id!=123

也许您可以查看项目的代码,您可以在这里找到GeneratorViewController类,其中有两个表视图,一个显示所有可用的块,另一个显示当前生成器中的块。每个块都可以有一个分隔符,这就是我创建的原因d GeneratorBrick类,将Generator、Brick和Separator链接在一起。当然,一个Brick可以在多个生成器中,并且在每个生成器中都可以有不同的分隔符。您真的认为有办法简化这种关系吗?谢谢,目标是只在左侧的表视图中显示右侧未显示的那些Brick。