/ / Realm, Swift, много от много отношения - ios, swift, царство

Реалм, Суифт, много от много отношения - ios, swift, царство

На моя API имам връзка между щандовеи продукти. В кои щандове има продукти, но продукти могат да бъдат намерени и на различни щандове. Опитвам се да възпроизведа тези взаимоотношения в приложението ми с iOS, използвайки Realm, но не мога да го оправя.

Целта на тази връзка е да може да търси щандове, които продават конкретни продукти.

Моят модел:

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"
}
}

Когато правя моята API заявка за Stands, извличамасоциираните продукти с него. Когато ги прибавя към щандовете, тя работи добре за модела ми, тъй като продуктите обикновено се добавят в списъка ().

Но всички продукти се създават поотделно, без да се закрепват към тях.

Има ли начин директно да зададете тези щандове на продуктите при създаването на продуктите? Точно както се случва на другия път?

Моето текущо решение е това ..

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

Това съхранява щандовете и добавя продукти към тях. Той също така създава всички продукти и добавя 1 щанд за 10 ish продукти (?).

Не мога да разбера как да направя тази работа. Някой знае ли как да реши това? Или по-добро решение?

Отговори:

4 за отговор № 1

Вместо да се налага двойното водене на счетоводствоза да поддържате обратните отношения ръчно, трябва да използвате механизма на обратните отношения на 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 Връзки за повече информация.