【问题标题】:Drop a table in a RealmSwift migration在 RealmSwift 迁移中删除表
【发布时间】:2019-08-20 10:19:58
【问题描述】:

我正在从架构中删除一个旧的未使用的表。如何从旧版本的应用程序中删除它(DROP Table)?到目前为止我所尝试的

  1. configration.objectTypes 中删除了GameScore.self
  2. 颠倒的架构版本
  3. 运行应用程序
  4. 打开 Realm Studio,GameScore 表仍然存在,其中包含之前已经存在的数据

添加

config.migrationBlock = { migration, oldSchemaVersion in
            if oldSchemaVersion < 10 {
                migration.enumerateObjects(ofType: "GameScore", { (oldObject, newObject) in
                    if let oldObject = oldObject {
                        migration.delete(oldObject)
                    }

                })
            }

        }

将从 GameScore 中删除所有数据。我仍然不明白为什么领域没有完全删除 GameScore 表(我仍然可以在 Realm Studio 中看到它)

【问题讨论】:

    标签: ios swift realm realm-mobile-platform


    【解决方案1】:

    要完全删除一个表(在领域术语中称为 CLASS),需要执行以下操作:

     config.migrationBlock = { migration, oldSchemaVersion in
                if oldSchemaVersion < 10 {
                    migration.deleteData(forType: "GameScore")
                }
    
            }
    
    

    我最初的解决方案

    config.migrationBlock = { migration, oldSchemaVersion in
                if oldSchemaVersion < 10 {
                    migration.enumerateObjects(ofType: "GameScore", { (oldObject, newObject) in
                        if let oldObject = oldObject {
                            migration.delete(oldObject)
                        }
    
                    })
                }
    
            }
    

    只会删除该表的内容,它会清除数据但不会从数据库中删除该表。

    【讨论】:

    • 哈哈。好吧,我早些时候回答了这个问题,忘记发布了,我一看到你就找到了答案。我在回答中添加了更多上下文,但这是一个很好的发现,因为以前的方法似乎不再起作用了。
    【解决方案2】:

    删除表与从领域中删除领域对象及其所有数据相同。

    如果是这样,就不需要迭代了。在您的迁移块中,只需使用 deleteData(forType:)

    删除具有给定名称的类的数据。

    给定类的所有对象都将被删除。如果 Object 子类 不再存在于您的程序中,该类的任何剩余元数据 将从 Realm 文件中删除。

    三个步骤

    1) 从代码中移除 Realm Object 类

    2) 增加迁移块中的 schemaVersion。这会通知领域有一个新架构

    3) 通过使用对象名称的字符串删除迁移块中的对象及其数据。

    假设我们正在处理模式版本 1 并且有一个我们想要摆脱的 TestClass Realm 对象。从代码中删除类,递增到模式 2 并使用 deleteData

    let config = Realm.Configuration (
        schemaVersion: 2,
        migrationBlock: { migration, oldSchemaVersion in
            migration.deleteData(forType: "TestClass")
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2018-12-15
      • 2018-10-14
      • 2018-09-22
      • 2021-12-26
      相关资源
      最近更新 更多