如何在Realm Swift上查询List <int>

时间:2019-01-10 16:44:33

标签: ios swift realm realm-mobile-platform realm-list

如何过滤具有给定Int的RealmFilter.objectIds?

func delete(ids: [Int]) {
   let filterResultsToDelete = realm.objects(CRMRealmFilterResult.self).filter("ANY objectIds IN %@",ids)
//Crashes
}


class RealmFilterResult : Object {
    @objc dynamic var filterId: Int = 0
    let objectIds = List<Int>()

    override static func primaryKey() -> String {
        return "filterId"
    }
  }

2 个答案:

答案 0 :(得分:0)

Realm尚不支持查询基元(即非List子类,例如Object的基元)的Int

您可以在this GitHub issue上关注其状态。

答案 1 :(得分:0)

这可能根本不是您想要的,但这是一个很好的练习。也许这会有所帮助。

让我重申一下我想您要问的问题:您有一系列对象,每个对象都具有Int的List属性,并且您希望能够查询其对象中具有特定int的所有对象。列表

使用一个更真实的示例,假设我们有一个球队列表,并且我们保留了每个球队内的比赛得分列表(一个列表)

class TeamObject: Object {
    @objc dynamic var object_id = NSUUID().uuidString

    let scoreList = List<ScoreObject>()

    override static func primaryKey() -> String? {
        return "object_id"
    }
}

我们有一个得分对象,该得分对象将得分存储为Int(以及其他详细信息,例如他们玩的人或日期)

class ScoreObject: Object {
    @objc dynamic var score = 0
    let teamsWithScores = LinkingObjects(fromType: TeamObject.self, property: "scoreList")
}

为简单起见,让我们创建三个得分和两个团队,并在列表中给每个团队两个得分。

let score1 = ScoreObject()
score1.score = 1
let score2 = ScoreObject()
score2.score = 2
let score3 = ScoreObject()
score3.score = 3

let t1 = TeamObject()
t1.scoreList.append(score1)
t1.scoreList.append(score3)

let t2 = TeamObject()
t2.scoreList.append(score2)
t2.scoreList.append(score3)

并将其写入领域

try! realm.write {
    realm.add(t1)
    realm.add(t2)
}

从那里,我们可以获得得分为1的任何团队,这解决了获取具有包含给定int列表的对象的问题。

let results = realm.objects(ScoreObject.self).filter("score IN %@", [1])
if results.count > 0 {
    for aScore in results {
        let teamsWithThisScore = aScore.teamsWithScores
        for team in teamsWithThisScore {
            print("score: \(aScore.score)")
            print("     id: \(team.object_id)")
        }
    }
} else {
    print("no teams with those scores")
}

您可以在此基础上扩展以获得具有多个得分(整数)的团队(对象)

let results = realm.objects(ScoreObject.self).filter("score IN %@", [1,3])

就像我说的那样,它可能不是基础,但确实以面向对象的方式提供了解决方案。