/ / Realm, Swift, veľa vzťahov - ios, swift, realm

Realm, Swift, veľa vzťahov - ios, swift, realm

Na mojom rozhraní API mám vzťah medzi stánkamia produkty. V ktorých stánkoch sú výrobky, ale výrobky sa nachádzajú aj v rôznych stánkoch. Snažím sa toto vzťahy replikovať v mojej aplikácii iOS pomocou Realm, ale nemôžem to vyriešiť.

Cieľom tohto vzťahu je hľadať stánky, ktoré predávajú konkrétne produkty.

Môj model:

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

Pri podávaní žiadosti o rozhranie API pre stánky sa mi načítapridružené produkty spolu s ním. Keď ich pridám do stojanov, funguje to pre môj model Stands, pretože produkty sú normálne pridané do zoznamu ().

Ale všetky produkty sú individuálne vytvorené bez toho, aby k nim boli pripojené žiadne stojany.

Existuje spôsob, ako priamo priradiť tieto stánky k produktom po vytvorení produktov? Rovnako ako to sa deje naopak?

Moje súčasné riešenie je toto ..

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

Tento stojany sa ukladajú a pridávajú sa do nich. Taktiež vytvára všetky produkty a pridáva 1 stojan na 10 výrobkov (?).

Nemôžem zistiť, ako to urobiť, to niekto iný vie, ako to vyriešiť? Alebo lepšie riešenie?

odpovede:

4 pre odpoveď č. 1

Namiesto toho je potrebné vykonať dvojité vedenie účtovníctvaaby ste ručne udržali inverzné vzťahy, mali by ste použiť mechanizmus inverzných vzťahov Realm, ktorý vám poskytuje všetky objekty, ktoré ukazujú na iný objekt pomocou danej vlastnosti:

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

Pozrite si dokumenty v oblasti Realm Inverzné vzťahy Pre viac informácií.