簡體   English   中英

通過快速將對象與NSPredicate數組中的對象的鍵路徑進行比較來過濾多對多關系

[英]Filtering many-to-many relation by comparing objects agains keypath of objects in array with NSPredicate in swift

我希望你能幫助我。 我正在使用Realm作為底層數據庫系統來構建Mac OS X App。

我的模型如下所示:

-磚:由屬性標題和文本組成的文本磚

-GeneratorBrick:多對多關系對象,用於對Generator,Brick和其他與問題無關的數據之間的關系進行建模。 該對象的屬性稱為“磚”

-Generator:由一些文本以及屬性名稱為“ generatorBricks”的GeneratorBrick列表組成的配置

在我的應用程序中,我現在有了一個Generator對象。 這個擁有一系列GeneratorBrick對象的列表,每個對象本身都有一個Brick和一些其他數據。 我將它們顯示在TableView中。 現在,我想顯示另一個TableView,其中僅顯示那些不在當前Generator的TableView中的Brick對象。 我通過generator.generatorBricks[index].brick訪問generator.generatorBricks[index].brick

在我的應用程序的早期版本中,我通過var bricks: Results<Brick> = try! Realm().objects(Brick).sorted("title").filter("inGenerator = false")加載了我需要的所有Brick對象var bricks: Results<Brick> = try! Realm().objects(Brick).sorted("title").filter("inGenerator = false") var bricks: Results<Brick> = try! Realm().objects(Brick).sorted("title").filter("inGenerator = false")但是由於我的模型從使用屬性“ 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

你了解我的問題嗎? 您是否需要其他信息? 如果您能向我提示正確的方向,我很高興提供。 先感謝您。

在具有(昂貴)聯接操作的傳統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對象(類/結構),它們將是什么樣。

我得出的結論是,我想做的事不能簡單地通過基於圖的領域來實現。 至少並非沒有加載所有磚,發電磚和發電機,並通過迭代所有磚並檢查它們是否為當前發電機的一部分來進行手動比較。

我本來需要

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM