我有一个Realm对象,它有几个关系,任何人都有一个很好的代码片段,可以概括一个复制方法,在数据库中创建一个副本。
答案 0 :(得分:21)
在我的情况下,我只是想创建一个对象而不是坚持它。所以segiddins
的解决方案并不适用于我。
Swift 3
要在swift
中创建用户对象的克隆,只需使用
let newUser = User(value: oldUser)
;
新用户对象未被保留。
答案 1 :(得分:7)
您可以使用以下内容创建对象的浅表副本,只要它没有主键:
realm.create(ObjectType.self, withValue: existingObject)
答案 2 :(得分:2)
我遇到了类似的问题,并找到了一个简单的解决方法来获取领域对象的副本。基本上你只需要使对象符合NSCopying协议,例如:
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
}
}
然后你只需要调用" copy()"对象上的方法:
class ViewController: UIViewController {
var original = Original()
override func viewDidLoad() {
super.viewDidLoad()
var myCopy = original.copy()
}
}
拥有副本的好处是我可以修改它而无需在域写入事务中。当用户正在编辑某些数据但没有点击保存或只是改变主意时很有用。
答案 3 :(得分:0)
由于这个问题仍然存在,我发布我的解决方案,但仍有待改进。
我创建了一个Object类的扩展,它具有这个方法重复,它接受一个对象objOut
并通过查看self来填充平面属性。当找到非平面属性(也称为嵌套对象)时,将跳过一个属性。
// 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
}
在我的Realms的Manager类中,我使用了用于创建对象副本的方法copyFromRealm()
。
为了给你一个实际的例子,这是我的Appointment类的结构:
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
这就是我实现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
}
我无法找到一种合理的方法来处理duplicate()方法中的嵌套对象。我想到了递归,但代码复杂性提高了太多。
这不是最佳但是有效,如果我找到管理嵌套对象的方法,我会更新这个答案。
答案 4 :(得分:0)
斯威夫特 5+
创建具有 ID 的现有 Realm 托管对象的 Realm 托管副本
double (*)[3]