【问题标题】:Can not add objects from a different Realm iOS & Swift无法从不同的 Realm iOS 和 Swift 添加对象
【发布时间】:2016-12-14 08:55:51
【问题描述】:

在我的应用程序中,我正在管理多个领域数据库文件,就是这样,对于每个登录的用户,都存在一个领域文件 (.realm)。

因此,当用户登录应用程序时,我正在执行以下操作:

class func setDefaultsForLocationId(_ userId: String) {
    var config = RealmManager.realmConfiguration()
    // Use the default directory, but replace the filename with the business id
    config.fileURL = config.fileURL!.deletingLastPathComponent()
        .appendingPathComponent("\(userId).realm")
    // Set this as the configuration used for the default Realm
    Realm.Configuration.defaultConfiguration = config
}

完成后,我开始使用以下方法添加到领域:

fileprivate func storeTransaction(_ student: Student) -> Bool {
    let realm = try! Realm()
    var retVal = true
    do {
        try realm.write {
            realm.add(student, update: true)
        }
    } catch {
        retVal = false
    }
    return retVal
}

在当前用户注销并且新用户登录之前,这将正常工作,将引发异常: 无法添加来自不同领域的对象。

注意 1:我一次只使用一个领域实例,而不是同时使用来自不同 .realm 文件的多个实例。

注意2:我发现如果我使用同一个帐户注销和登录;只有当我使用不同的帐户时才会出现异常!

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    一般来说,添加来自不同领域的对象被认为是一个错误。如果对象是混合的,那么分离文件是没有意义的。因此,在切换 Realm 文件时,您应该自己销毁或重新加载属于之前 Realm 的对象。

    如果这是有意的行为,有一种方法可以通过从 Realm 中分离 Student 对象来避免异常,如下所示。

    fileprivate func storeTransaction(_ student: Student) -> Bool {
        let detachedStudent = Student(value: student)
        ...
            realm.add(detachedStudent)
        ...
    

    【讨论】:

    • 一般来说,我一次使用一个领域,我不会同时处理来自不同 .realm 文件的多个领域实例。我想知道是否有办法刷新领域的内存!
    • 分离的想法行不通!它产生相同的异常
    • 也许Student 有其他对象作为关系?如果是这样,您应该递归地分离关系对象。无论如何,由于您不会同时处理多个领域,因此您应该在切换领域时清除旧领域对象。因此,您应该在切换领域后重新创建领域并重新获取领域对象。你能说明如何调用storeTransaction() 方法吗?
    • 是的,它有一个 List 类型的属性,那么分离会怎样!实际上,我试图通过使用 realm.deleteAll() 删除所有领域对象来进行清除,但没有任何改变。 storeTransaction() 是从名为 StudentsManager 的管理器中调用的,该管理器创建学生的实例并将其作为参数传递给 storeTransaction(_ student: Student)
    • 好的,这就是我的结论并解决了问题,Studen 类有一个函数,它返回另一个领域类的单例实例。所以当我切换到另一个领域时;该单例实例仍然相同。所以我所做的就是每当我切换到另一个领域时;我确实重置了那个解决了我的问题的实例!
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多