Mam obiekt Realm, który ma kilka relacji, każdy ma dobry fragment kodu, który uogólnia metodę kopiowania, aby utworzyć duplikat w bazie danych.W jaki sposób można łatwo powielić/skopiować istniejący obiekt dziedzinowy
Odpowiedz
można użyć następujących czynności, aby utworzyć płytkie kopię obiektu, tak długo jak nie ma klucz podstawowy:
realm.create(ObjectType.self, withValue: existingObject)
Ponieważ problem ten jest wciąż żywa zamieścić moje rozwiązanie, które działa, ale nadal wymaga poprawy. Utworzono rozszerzenie klasy Object, która ma tę metodę duplikowania, która pobiera obiekt objOut
i wypełnia płaskie właściwości, patrząc na siebie. Gdy zostanie znaleziona niepusta właściwość (aka zagnieżdżony obiekt), która jest pomijana.
// Duplicate object with its flat properties
func duplicate(objOut: Object) -> Object {
// Mirror object type
let objectType: Mirror = Mirror(reflecting: self);
// Iterate on object properties
for child in objectType.children {
// Get label
let label = child.label!
// Handler for flat properties, skip complex objects
switch String(describing: type(of: child.value)) {
case "Double", "Int", "Int64", "String":
objOut.setValue(self.value(forKey: label)!, forKey: label)
break
default:
break
}
}
return objOut
}
Wewnątrz klasy Manager dla moich Realms mam metodę copyFromRealm()
którego używam do tworzenia moich kopii obiektów. Aby dać praktyczny przykład tego jest struktura mojej klasie Powołanie:
Appointment object
- flat properties
- one UpdateInfo object
- flat properties
- one AddressLocation object
- flat properties
- one Address object
- flat properties
- one Coordinates object
- flat properies
- a list of ExtraInfo
- each ExtraInfo object
- flat properties
To jak mam wdrożony() metoda copyFromRealm:
// Creates copy out of realm
func copyFromRealm() -> Appointment {
// Duplicate base object properties
let cpAppointment = self.duplicate(objOut: Appointment()) as! Appointment
// Duplicate UIU object
cpAppointment.uiu = self.uiu?.duplicate(objOut: UpdateInfo()) as? UpdateInfo
// Duplicate AddressLocation object
let cpAddress = self.addressLocation?.address?.duplicate(objOut: Address()) as? Address
let cpCoordinates = self.addressLocation?.coordinates?.duplicate(objOut: Coordinates()) as? Coordinates
cpAppointment.addressLocation = self.addressLocation?.duplicate(objOut: AddressLocation()) as? AddressLocation
cpAppointment.addressLocation?.address = cpAddress
cpAppointment.addressLocation?.coordinates = cpCoordinates
// Duplicate each ExtraInfo
for other in self.others {
cpAppointment.others.append(other.duplicate(objOut: ExtraInfo()) as! ExtraInfo)
}
return cpAppointment
}
nie byłem w stanie znaleźć dobry i rozsądny sposób pracy z obiektami zagnieżdżonymi w mojej metodzie duplicate(). Pomyślałem o rekursji, ale zbyt skomplikowana kod.
To nie jest optymalne, ale działa, jeśli znajdę sposób na zarządzanie również zagnieżdżonym obiektem, zaktualizuję tę odpowiedź.
Miałem podobny problem i znalazłem proste rozwiązanie, aby uzyskać kopię obiektu dziedziny. W zasadzie wystarczy, aby przedmiot zgodny z protokołem NSCopying, coś jak:
import RealmSwift
import Realm
import ObjectMapper
class Original: Object, NSCopying{
dynamic var originalId = 0
dynamic var firstName = ""
dynamic var lastName = ""
override static func primaryKey() -> String? {
return "originalId"
}
init(originalId: Int, firstName: String, lastName: String){
super.init()
self.originalId = originalId
self.firstName = firstName
self.lastName = lastName
}
func copy(with zone: NSZone? = nil) -> Any {
let copy = Original(originalId: originalId, firstName: firstName, lastName: lastName)
return copy
}
}
wtedy właśnie nazywamy „kopii()” metoda na obiekcie:
class ViewController: UIViewController {
var original = Original()
override func viewDidLoad() {
super.viewDidLoad()
var myCopy = original.copy()
}
}
Zaletą posiadanie kopii polega na tym, że mogę ją zmodyfikować bez konieczności rejestrowania transakcji w sferze. Przydatne, gdy użytkownicy edytują niektóre dane, ale nie poczynili jeszcze oszczędności lub po prostu zmienili zdanie.
W moim przypadku chciałem tylko stworzyć obiekt i go nie utrzymywać. więc rozwiązanie segiddins
nie działa dla mnie.
Swift 3
Aby utworzyć klon obiektu użytkownika w swift
wystarczy użyć
let newUser = User(value: oldUser)
;
Nowy obiekt użytkownika nie jest zachowywany.
- 1. W jaki sposób łatwo udostępniasz zmienne innym czynnościom?
- 2. W języku Python, w jaki sposób można łatwo pobrać posortowane elementy ze słownika?
- 3. Wykorzystanie PowerShell zawinąć istniejący obiekt COM
- 4. Zdobądź już istniejący obiekt z innej klasy
- 5. W jaki sposób można użyć std :: bind?
- 6. nazwa jest już używana przez istniejący obiekt
- 7. Czy mogę zaktualizować istniejący obiekt Amazon S3?
- 8. można file.renameAby zastąpić istniejący plik?
- 9. Jak przedłużyć istniejący obiekt w C# 4.0 używając dynamiki
- 10. Które reguły określają, czy obiekt można w łatwy sposób kopiować?
- 11. W jaki sposób można zreplikować saveOrUpdate Hibernate w JPA?
- 12. W jaki sposób można łączyć warunki filtrowania?
- 13. W jaki sposób można zaimplementować kamerę FPS?
- 14. W jaki sposób można rozszerzyć wiersze?
- 15. W jaki sposób metoda członka może usunąć obiekt?
- 16. Istniejący obiekt docelowy nie ma sekcji "szybkiego generowania kodu kompilatora"
- 17. Jak mogę wypełnić istniejący obiekt z JToken (przy użyciu Newtonsoft.Json)?
- 18. W jaki sposób jawnie niszczysz obiekt w Perlu?
- 19. W jaki sposób POST obiekt FormData w Angular 2?
- 20. W MongoDB mapreduce, w jaki sposób mogę spłaszczyć obiekt wartości?
- 21. W JPA 2.0 JPQL, gdy jeden zwraca NOWY obiekt, w jaki sposób można użyć powiązań FETCH?
- 22. W jaki sposób aplikacja C# może łatwo komunikować się i przesyłać pliki w sieci?
- 23. W jaki sposób obiekt Javascript Map usprawni nasze kodowanie?
- 24. W jaki sposób binarny (de) serializuje obiekt do ciągu/formularza?
- 25. W jaki sposób {... obiekt, właściwość: wartość} działa ze składnią rozproszoną?
- 26. Czy obiekt może się sam usunąć? W jaki sposób?
- 27. W jaki sposób viewControllerWithRestorationIdentifierPath: coder: znaleźć istniejącą instancję?
- 28. W jaki sposób deserializować obiekt utrzymywany w db teraz, gdy obiekt ma inny serialVersionUID
- 29. W jaki sposób funkcja get_or_create w Django zwraca dwie wartości?
- 30. Chcę zastosować istniejący styl CSS do wszystkich etykiet na stronie. W jaki sposób?
W moim przypadku istnieje klucz podstawowy, w takim przypadku zagram wniosek o funkcję na github. – mvo
Idea: czy istnieje sposób na odłączenie obiektu (i jego relacji) od sfery, a następnie zastąpienie kluczy podstawowych w obiekcie (i jego relacjami), a następnie dodanie go ponownie? – mvo
Obecnie nie ma sposobu na zrobienie tego wbudowanego w dziedzinę, ale można wykonać kopię rekurencyjną ręcznie. Pamiętaj, aby połączyć ze mną zgłoszony problem! – segiddins