境界,斯威夫特,多对多关系

时间:2015-12-14 21:10:39

标签: ios swift realm

在我的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个产品(?)。

我似乎无法弄清楚如何使这项工作。有没有其他人知道如何解决这个问题?还是更好的解决方案?

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的文档。