swift - Realm Swift 选择与一对多关系实体中的一个字段匹配的所有值

标签 swift swift3 realm nspredicate

我在 Realm Product 和 ProductType 中有两个实体。产品与产品类型具有一对多关系。

产品实体一对多

import Foundation
import RealmSwift

class Product: Object{
    dynamic var productName = ""
    let productTypeList = List<ProductType>() 
}

ProductType 实体

import Foundation
import RealmSwift

class ProductType: Object{   
  dynamic var typeName: String = ""
  dynamic var typeLogoUrl: String = ""
}

我的目标是选择所有包含 ProductType typeName 的产品,例如“Electronics”。如果有这样的一对一关系,我可以轻松做到这一点

产品实体一对一

import Foundation
import RealmSwift

class Product:Object{
    dynamic var productName = ""
    dynamic var productType : ProductType? 
}

查询示例

let realm = try! Realm()
let productTypeName = "Electronics"
let predicate = NSPredicate(format: "productType.typeName == %@", productTypeName)
let rmProducts = realm.objects(Product.self).filter(predicate)

关于如何使用一对多版本的 Product 类进行查询有什么想法吗?

最佳答案

您可以使用子查询并检查列表中与名称匹配的产品类型的计数是否大于 0。

let rmProducts = realm.objects(Product.self).filter("SUBQUERY(productTypeList, $type, $type.typeName == %@).@count>0",productTypeName)

我已经在以下测试集上运行了查询并得到了预期的结果:

class Product:Object{
    dynamic var productName = ""
    var productTypeList = List<ProductType>()
}

class ProductType  : Object{
    dynamic var typeName: String = ""
    dynamic var typeLogoUrl: String = ""
}

let types = [ProductType(value: ["typeName":"Electronics","typeLogoUrl":"url"]),ProductType(value: ["typeName":"a","typeLogoUrl":"url"]),ProductType(value: ["typeName":"Electronics","typeLogoUrl":"a"]),ProductType(value: ["typeName":"b","typeLogoUrl":"url"])]

let prod1 = Product()
prod1.productName = "a"
prod1.productTypeList = List([types[0],types[1]])
let prod2 = Product()
prod2.productName = "b"
prod2.productTypeList = List([types[3],types[1]])
let prod3 = Product()
prod3.productName = "c"
prod3.productTypeList = List([types[2],types[1]])
var prod4 = Product()
prod4.productName = "d"
prod4.productTypeList = List([types[1]])

try! realm.write {
    realm.add(types)
    realm.add([prod1,prod2,prod3,prod4])
}

let productTypeName = "Electronics"
let predicate = NSPredicate(format: "productType.typeName == %@", productTypeName)
let rmProducts = realm.objects(Product.self).filter("SUBQUERY(productTypeList, $type, $type.typeName == %@).@count>0",productTypeName)
print(rmProducts) //rmProducts contains prod1 and prod3 as expected

关于swift - Realm Swift 选择与一对多关系实体中的一个字段匹配的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757959/

相关文章:

ios - 在展开可选值时意外发现 nil,当尝试更改标签的文本时,由通知触发

ios - 可以导入 RealmSwift,不能实例化

dictionary - Realm中的HashMap序列化(移动数据库)

swift - 准备(对于 : sender:) not getting called during segue from button to tab bar controller (in Swift 4, Xcode 9)

ios - 具有不同数据的 TableView 自定义单元格

ios - 如何将 UnsafePointer 映射到另一种类型?

ios - swift 3.1 中的 URL 编码

ios - UICollectionViewCell 中的 Realm 对象级通知

html - 快速4错误: load html string to webview

ios - Swift Array<UInt8> 转换为字符串