领域 Swift 基于列表的过滤查询 属性
Realm Swift Filter Query Based On List Property
我需要一些有关领域 swift 查询的帮助。这是业务上下文:
有两种用户类型:
用户类型 1:演出经理
节目经理可以创建节目。您将在下面找到 Show 对象的必要详细信息。如您所见,每个节目都有一个 属性 artistResponses,它是 ArtistResponse 的列表。
class Show: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
@objc dynamic var showManager: ShowManager!
@objc dynamic var venueName = ""
@objc dynamic var city = ""
...
**let artistResponses = List<ArtistResponse>()**
override static func primaryKey() -> String? {
return "id"
}
...
}
用户类型 2:艺术家
一个艺术家对象有一个 citiesOfInterest 属性 应用程序上的艺术家应该只显示由表演城市在艺术家的 citiesOfInterest 中的表演经理创建的表演。然后艺术家可以查看这些节目并做出回应,这会创建一个 ArtistResponse 对象并将其添加到上面显示的 Show 对象列表中。您将在下面找到艺术家和 ArtistResponse 对象的必要详细信息。
class Artist: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
**let citiesOfInterest = List<String>()**
}
class ArtistResponse: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
@objc dynamic var show: Show!
@objc dynamic var artist: Artist!
**@objc dynamic var available = true**
override static func primaryKey() -> String? {
return "id"
}
}
我遇到的问题与确定它是否是新节目有关(即艺术家没有与节目相关联的 ArtistResponse 将自己列为可用或不可用)。
这是一个例子:
一位名叫 Bob 的节目经理创建了一个节目,其中城市 = “Austin”
一位名叫 Jim 的艺术家拥有 citiesOfInterest = [“Austin”、“Seattle”、“San Francisco”]
Jim,艺术家,进入应用程序,应该看到演出经理 Bob 发布的这个新演出列表,因为 Jim 的 citiesOfInterest 包含“Austin”,演出的城市等于“Austin”并且没有艺术家对 Jim 的回应。
我研究过并发现 Realm 中的列表存在限制。
https://forum.realm.io/t/predicate-to-search-in-field-of-type-list/733
https://github.com/realm/realm-cocoa/issues/5334
请帮助查询:
Realm.objects(Show.self).filter(“以某种方式确定 artistResponses 列表中没有与 Jim 相关的 artistResponse”)
有人可以帮我解决这个问题吗?我希望我已经提供了足够的解释。
让我重述一下问题;
You want an artist to be able to query for all new shows in cities
they are interested in where they have not yet responded.
如果这是问题,让我从一些简单的示例数据开始
两位艺术家各自有两个城市如果感兴趣
let a0 = Artist()
a0.name = "Jim"
a0.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])
let a1 = Artist()
a1.name = "Henry"
a1.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])
然后两场演出,每个城市一场
let s0 = Show()
s0.name = "Austin Show"
s0.city = "Austin"
let s1 = Show()
s1.name = "Memphis Show"
s1.city = "Memphis"
但艺术家 a0 (Jim) 已对 s0 (Austin) 的演出做出回应
let r0 = ArtistResponse()
r0.show = s0
r0.artist = a0
r0.available = true
s0.artistResponses.append(r0) //jim responded to the Austin show
我们想要的结果是当艺术家吉姆登录时,他会看到孟菲斯的演出,因为他已经回应了奥斯汀的演出。
let realm = try! Realm()
if let jim = realm.objects(Artist.self).filter("name == 'Jim'").first {
let myCities = jim.citiesOfInterest
let showResults = realm.objects(Show.self)
.filter("city IN %@ AND !(ANY artistResponses.artist.name == 'Jim')", myCities)
for show in showResults {
print(show.name)
}
}
输出为
Memphis Show
我们首先将 Jim 的兴趣城市作为一个数组,然后过滤与这些兴趣城市相匹配但没有与 Jim 关联的艺术家响应的节目。此过滤器基于名称,但您可以使用艺术家 ID 甚至艺术家对象本身作为比较器。
我需要一些有关领域 swift 查询的帮助。这是业务上下文:
有两种用户类型:
用户类型 1:演出经理
节目经理可以创建节目。您将在下面找到 Show 对象的必要详细信息。如您所见,每个节目都有一个 属性 artistResponses,它是 ArtistResponse 的列表。
class Show: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
@objc dynamic var showManager: ShowManager!
@objc dynamic var venueName = ""
@objc dynamic var city = ""
...
**let artistResponses = List<ArtistResponse>()**
override static func primaryKey() -> String? {
return "id"
}
...
}
用户类型 2:艺术家
一个艺术家对象有一个 citiesOfInterest 属性 应用程序上的艺术家应该只显示由表演城市在艺术家的 citiesOfInterest 中的表演经理创建的表演。然后艺术家可以查看这些节目并做出回应,这会创建一个 ArtistResponse 对象并将其添加到上面显示的 Show 对象列表中。您将在下面找到艺术家和 ArtistResponse 对象的必要详细信息。
class Artist: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
**let citiesOfInterest = List<String>()**
}
class ArtistResponse: Object {
@objc dynamic var id = UUID().uuidString
@objc dynamic var createdDate = Date()
@objc dynamic var show: Show!
@objc dynamic var artist: Artist!
**@objc dynamic var available = true**
override static func primaryKey() -> String? {
return "id"
}
}
我遇到的问题与确定它是否是新节目有关(即艺术家没有与节目相关联的 ArtistResponse 将自己列为可用或不可用)。
这是一个例子:
一位名叫 Bob 的节目经理创建了一个节目,其中城市 = “Austin” 一位名叫 Jim 的艺术家拥有 citiesOfInterest = [“Austin”、“Seattle”、“San Francisco”]
Jim,艺术家,进入应用程序,应该看到演出经理 Bob 发布的这个新演出列表,因为 Jim 的 citiesOfInterest 包含“Austin”,演出的城市等于“Austin”并且没有艺术家对 Jim 的回应。
我研究过并发现 Realm 中的列表存在限制。
https://forum.realm.io/t/predicate-to-search-in-field-of-type-list/733 https://github.com/realm/realm-cocoa/issues/5334
请帮助查询:
Realm.objects(Show.self).filter(“以某种方式确定 artistResponses 列表中没有与 Jim 相关的 artistResponse”)
有人可以帮我解决这个问题吗?我希望我已经提供了足够的解释。
让我重述一下问题;
You want an artist to be able to query for all new shows in cities they are interested in where they have not yet responded.
如果这是问题,让我从一些简单的示例数据开始
两位艺术家各自有两个城市如果感兴趣
let a0 = Artist()
a0.name = "Jim"
a0.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])
let a1 = Artist()
a1.name = "Henry"
a1.citiesOfInterest.append(objectsIn: ["Austin", "Memphis"])
然后两场演出,每个城市一场
let s0 = Show()
s0.name = "Austin Show"
s0.city = "Austin"
let s1 = Show()
s1.name = "Memphis Show"
s1.city = "Memphis"
但艺术家 a0 (Jim) 已对 s0 (Austin) 的演出做出回应
let r0 = ArtistResponse()
r0.show = s0
r0.artist = a0
r0.available = true
s0.artistResponses.append(r0) //jim responded to the Austin show
我们想要的结果是当艺术家吉姆登录时,他会看到孟菲斯的演出,因为他已经回应了奥斯汀的演出。
let realm = try! Realm()
if let jim = realm.objects(Artist.self).filter("name == 'Jim'").first {
let myCities = jim.citiesOfInterest
let showResults = realm.objects(Show.self)
.filter("city IN %@ AND !(ANY artistResponses.artist.name == 'Jim')", myCities)
for show in showResults {
print(show.name)
}
}
输出为
Memphis Show
我们首先将 Jim 的兴趣城市作为一个数组,然后过滤与这些兴趣城市相匹配但没有与 Jim 关联的艺术家响应的节目。此过滤器基于名称,但您可以使用艺术家 ID 甚至艺术家对象本身作为比较器。