通过比较对象,将数组中对象的keypath与swift

时间:2015-11-05 10:04:46

标签: swift macos nspredicate realm

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

我的模型看起来像这样:

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

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

-Generator:由一些文本以及属性名称为“generatorBricks”的GeneratorBricks列表组成的配置

在我的应用程序中,我现在有一个Generator对象。这个包含一堆GeneratorBrick对象的列表,这些对象本身都有一个Brick和一些其他数据。我在TableView中显示它们。我现在想要显示另一个TableView,其中我只显示那些不在当前Generator的TableView中的Brick对象。我访问的发电机砖 generator.generatorBricks[index].brick

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

你明白我的问题吗?您需要其他信息吗?如果你能给我一个正确方向的暗示,我很乐意提供。提前谢谢。

2 个答案:

答案 0 :(得分:0)

使用(昂贵的)连接操作在传统SQL中会做什么,你应该在Realm中使用(廉价)图形关系来做:

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%确定这是否是您尝试建模的操作,而且我认为如果我真正了解您的内容,这些模型可以更加简化试图完成。

但要点是,Realm是一个图形数据库(不是关系型),因此链接本身就是表示的。如果它们是100%内存中的普通旧Swift对象(类/结构),请尝试考虑模型的外观。

答案 1 :(得分:0)

我得出的结论是,我想要做的事情不仅仅是基于图形的Realm可以实现的。至少在没有加载所有砖块,发电机砖和发电机的情况下,通过迭代所有砖块并检查它们是否是当前发电机的一部分来进行手动比较。

我需要像

这样的东西

SELECT brick.* FROM brick JOIN generatorbrick on brick.id = generatorbrick.brickId JOIN generator on generator.id = generatorbrick.generatorId WHERE generator.id != 123