在我的API上,我与Stands和Products之间建立了关系。哪些产品有产品,但产品也可以在不同的产品中找到。我尝试使用Realm在我的iOS应用程序上复制这种关系,但我似乎无法让它运行起来。
建立这种关系的目标是能够搜索销售特定产品的Stands。
我的模特:
class Stand: Object {
dynamic var id : Int = 0
dynamic var name : String = ""
dynamic var latitude : Double = 0.0
dynamic var longitude : Double = 0.0
let products = List<Product>()
override static func primaryKey() -> String? {
return "id"
}
}
class Product: Object {
dynamic var id : Int = 0
dynamic var name : String = ""
let stands = List<Stand>()
override static func primaryKey() -> String? {
return "id"
}
}
在执行我对Stands的API请求时,我也会检索相关的产品。当我将它们附加到支架上时,它适用于我的Stands模型,因为产品通常只是添加在List()中。
但所有产品都是单独创建的,没有附加任何支架。
有没有办法在创建产品时直接将这些支架分配给产品?就像它反过来发生的一样?
我目前的解决方案是......
func retrieveAndCacheStands(clearDatabase clearDatabase: Bool?) {
backend.retrievePath(endpoint.StandsIndex, completion: { (response) -> () in
let listOfProducts : List<(Product)> = List<(Product)>()
func addProducts(stand: Stand, products: List<(Product)>?) {
for product in products! {
print(product.name)
let newProduct = Product()
newProduct.id = product.id
newProduct.name = product.name
newProduct.stands.append(stand)
try! self.realm.write({ () -> Void in
self.realm.create(Product.self, value: newProduct, update: true)
})
}
listOfProducts.removeAll()
}
for (_, value) in response {
let stand = Stand()
stand.id = value["id"].intValue
stand.name = value["name"].string!
stand.latitude = value["latitude"].double!
stand.longitude = value["longitude"].double!
for (_, products) in value["products"] {
let product = Product()
product.id = products["id"].intValue
product.name = products["name"].string!
stand.products.append(product)
listOfProducts.append(product)
}
try! self.realm.write({ () -> Void in
self.realm.create(Stand.self, value: stand, update: true)
})
addProducts(stand, products: listOfProducts)
}
print(Realm.Configuration.defaultConfiguration.path!)
}) { (error) -> () in
print(error)
}
}
这将存储支架并向其添加产品。它还可以创建所有产品,每10个产品增加1个产品(?)。
我似乎无法弄清楚如何使这项工作。有没有其他人知道如何解决这个问题?还是更好的解决方案?
答案 0 :(得分:5)
您应该使用Realm的反向关系机制来代替使用给定属性指向另一个对象的所有对象,而不是手动维护反向关系所需的双重记录:
class Product: Object {
dynamic var id: Int = 0
dynamic var name: String = ""
// Realm doesn't persist this property because it is of type `LinkingObjects`
// Define "stands" as the inverse relationship to Stand.products
let stands = LinkingObjects(fromType: Stand.self, property: "products")
override static func primaryKey() -> String? {
return "id"
}
}
有关详细信息,请参阅Inverse Relationships上的Realm的文档。