如何轻松复制/复制现有领域对象

时间:2015-05-09 20:25:37

标签: swift realm

我有一个Realm对象,它有几个关系,任何人都有一个很好的代码片段,可以概括一个复制方法,在数据库中创建一个副本。

5 个答案:

答案 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]