/ / Reich, schnell, viele-zu-viele-Beziehung - ios, schnell, Reich

Realm, Swift, Many-to-Many Beziehung - Ios, Swift, Realm

Auf meiner API habe ich eine Beziehung zwischen Ständenund Produkte. In welchen Ständen gibt es Produkte, aber auch in verschiedenen Ständen. Ich versuche, diese Beziehung auf meiner iOS-Anwendung zu replizieren, indem ich Realm verwende.

Das Ziel dieser Beziehung besteht darin, nach Ständen suchen zu können, die bestimmte Produkte verkaufen.

Mein Modell:

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

Wenn ich meine API-Anfrage für Stands erhalte, rufe ich sie abdie damit verbundenen Produkte auch. Wenn ich diese an die Ständer anhange, funktioniert es gut für mein Stands-Modell, da die Produkte normalerweise in der Liste () hinzugefügt werden.

Alle Produkte werden jedoch individuell erstellt, ohne dass Ständer daran befestigt sind.

Gibt es eine Möglichkeit, diese Stände direkt bei der Erstellung der Produkte den Produkten zuzuordnen? Genauso wie es anders herum läuft?

Meine derzeitige Lösung ist diese ..

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

Dadurch werden die Stände gespeichert und Produkte hinzugefügt. Es erstellt außerdem alle Produkte und fügt 1 Stand pro 10 ish-Produkte (?) Hinzu.

Ich kann mir nicht vorstellen, wie ich das schaffen kann. Weiß jemand sonst, wie man das löst?

Antworten:

4 für die Antwort № 1

Anstelle der doppelten Buchhaltung ist es notwendigUm inverse Beziehungen manuell zu verwalten, sollten Sie den inversen Beziehungsmechanismus von Realm verwenden, der alle Objekte enthält, die auf ein anderes Objekt verweisen, wobei eine bestimmte Eigenschaft verwendet wird:

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

Siehe die Dokumente von Realm auf Inverse Beziehungen für mehr Informationen.