Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 域迁移中的主键更新_Swift_Realm_Realm Migration - Fatal编程技术网

Swift 域迁移中的主键更新

Swift 域迁移中的主键更新,swift,realm,realm-migration,Swift,Realm,Realm Migration,在一些情况下,我必须更新一些对象模型,包括用作主键的属性 例如: 合并主键name(例如Georges,Anna…)和familyName(例如Johnson,Smith…)属性,并使用新合并的name(例如Georges Johnson…)作为主键 将标识符主键从typeInt设置为typeString 当然,文件中明确指出: 一旦将具有主键的对象添加到域中,就不能更改主键 您始终可以删除旧对象并创建新对象,但这会增加重新创建关系的复杂性 我很确定realm可能对标识符类型的更改不满意(根

在一些情况下,我必须更新一些对象模型,包括用作主键的属性

例如:

  • 合并主键
    name
    (例如Georges,Anna…)和
    familyName
    (例如Johnson,Smith…)属性,并使用新合并的
    name
    (例如Georges Johnson…)作为主键
  • 标识符
    主键从type
    Int
    设置为type
    String
当然,文件中明确指出:

一旦将具有主键的对象添加到域中,就不能更改主键

您始终可以删除旧对象并创建新对象,但这会增加重新创建关系的复杂性

我很确定realm可能对
标识符
类型的更改不满意(根据我遇到的抛出异常判断)


所以我想知道是否有一种更简单的方法来实现这个目标,或者我是否需要做大量的手工工作来实现我非常简单的目标。

来自Realm的Katsumi。领域支持主键迁移。 只能在迁移期间更改主键。因此,如果要更改现有的主键值,可以编写迁移块,然后可以为每个新对象指定新值。当然,这些值必须是唯一的

let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in
    migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in
        newObject!["key"] = ...
    })
})
您还可以更改主键类型。 在这种情况下,还需要编写迁移块并指定新值。因为更改类型时会清除主键属性。此外,还可以合并或拆分现有主键属性。您可以添加一个新属性,然后将其指定为主键,然后还应该编写迁移块并指定新的唯一值


然而,Realm的最新版本(2.8.0和2.8.1)产生了无意的错误,即使在迁移期间也不允许修改主键。因此,如果您很紧急,您应该使用以前的版本(2.7.x),如果您不紧急,请等待在下一版本中修复该错误

Katsumi来自这里的王国。领域支持主键迁移。 只能在迁移期间更改主键。因此,如果要更改现有的主键值,可以编写迁移块,然后可以为每个新对象指定新值。当然,这些值必须是唯一的

let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in
    migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in
        newObject!["key"] = ...
    })
})
您还可以更改主键类型。 在这种情况下,还需要编写迁移块并指定新值。因为更改类型时会清除主键属性。此外,还可以合并或拆分现有主键属性。您可以添加一个新属性,然后将其指定为主键,然后还应该编写迁移块并指定新的唯一值


然而,Realm的最新版本(2.8.0和2.8.1)产生了无意的错误,即使在迁移期间也不允许修改主键。因此,如果您很紧急,您应该使用以前的版本(2.7.x),如果您不紧急,请等待在下一版本中修复该错误

有一个更简单的方法。不要使用任何可能更改的字段作为主键。要么创建一个唯一的标识符,要么让realm为你做。有一个更简单的方法。不要使用任何可能更改的字段作为主键。要么创建一个唯一标识符,要么让realm为你做。所以我的问题实际上是由realm版本引起的。。。这就是为什么我真的很困惑。非常感谢您的出色工作和支持,我将尝试降级,看看情况如何。我已降级到2.7.0,现在一切都按预期重新运行。因此,我的问题实际上是由领域版本引起的。。。这就是为什么我真的很困惑。非常感谢您的出色工作和支持,我将尝试降级,看看情况如何。我已降级到2.7.0,现在一切正常。