当前位置:  开发笔记 > 编程语言 > 正文

领域,快速,多对多关系

如何解决《领域,快速,多对多关系》经验,为你挑选了1个好方法。

在我的API上,我拥有Stands和Products之间的关系。在哪些展位中有产品,但也可以在不同的展位中找到产品。我正在尝试使用Realm在我的iOS应用程序上复制这种关系,但似乎无法正常工作。

建立这种关系的目的是能够搜索出售特定产品的展台。

我的模特:

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()

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

class Product: Object {
    dynamic var id : Int = 0
    dynamic var name : String = ""
    let stands = List()

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

当执行我的Stands API请求时,我也会同时检索关联的产品。当我将这些附加到Stands上时,它对于我的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 ish产品(?)添加1个Stand。

我似乎无法弄清楚如何进行这项工作。有谁知道如何解决这个问题?还是更好的解决方案?



1> jpsim..:

您应该使用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"
    }
}

有关更多信息,请参见Realm关于逆向关系的文档。

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有