【问题标题】:How to completely remove Realm database from iOS?如何从 iOS 中彻底删除 Realm 数据库?
【发布时间】:2016-05-23 16:42:25
【问题描述】:

现在我收到错误 Property types for 'value' property do not match. Old type 'float', new type 'double'。如何清除数据库或成功迁移?

【问题讨论】:

  • 贴一些不起作用的代码。

标签: swift realm


【解决方案1】:

要从磁盘中彻底删除Realm文件并从头开始,只需使用NSFileManager手动删除即可。

例如删除默认的Realm文件:

NSFileManager.defaultManager().removeItemAtURL(Realm.Configuration.defaultConfiguration.fileURL!)

如果您想保留 Realm 文件,但要完全清空其中的对象,您可以调用 deleteAll() 来执行此操作:

let realm = try! Realm()
try! realm.write {
  realm.deleteAll()
}

更新:我觉得我在最初的回答中忽略了这一点。如果您选择从磁盘中删除 Realm 文件,则必须在应用程序的任何线程上打开它之前执行此操作。一旦打开,Realm 会在内部缓存一个对它的引用,即使文件被删除也不会被释放。

如果您确实需要在删除之前打开 Realm 文件以检查其内容,您可以将其包含在 autoreleasepool 中以执行此操作。

【讨论】:

  • 不错的答案,蒂姆。我们可以在删除之前将一些记录从旧数据库复制到新数据库(我们希望用户使用)吗?
  • @CchanchaRaj 谢谢!嗯,是的,您可以轻松地在 Realm 之间复制值,但在这种情况下,这意味着您必须在旧 Realm 上停留更长时间才能将数据复制到新 Realm。我可能会建议将新领域保存到不同的位置,一旦你完成了数据的复制,删除旧领域并用新领域替换它。确保在@autoreleasepool 中完成所有这些操作,以便在删除之前释放对旧领域的所有引用。 :)
  • 斯威夫特 3: try? FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!)
  • @TiM 如何确保在删除时没有使用领域活动对象,因为我已经尝试了您的两种方法,但仍然收到“领域对象已删除或无效”的错误.
【解决方案2】:

这是在 swift 4.1 中的做法:

FileManager.default.removeItem(at:Realm.Configuration.defaultConfiguration.fileURL!)  

【讨论】:

    【解决方案3】:

    斯威夫特 4.2:

    func remove(realmURL: URL) {
            let realmURLs = [
                realmURL,
                realmURL.appendingPathExtension("lock"),
                realmURL.appendingPathExtension("note"),
                realmURL.appendingPathExtension("management"),
                ]
            for URL in realmURLs {
                try? FileManager.default.removeItem(at: URL)
            }
    let url = Realm.Configuration.defaultConfiguration.fileURL!
    remove(realmURL: url)
    

    【讨论】:

      【解决方案4】:

      虽然其他 cmets 是对的,但您应该真正看看:https://realm.io/docs/swift/latest/#migrations

      它对如何进行迁移提供了非常清晰的解释,而且非常简单,如果可以帮助,最好删除所有内容。

      【讨论】:

        【解决方案5】:

        除了使用NSFileManager 删除文件外,还要删除.lock 文件和.management 文件夹。否则,如果你尝试重新创建同名的领域文件,它会给出一个错误,说它找不到它

        【讨论】:

          【解决方案6】:

          斯威夫特 4.2 删除数据库:

          func remove(realmURL: URL) {
                  let realmURLs = [
                      realmURL,
                      realmURL.appendingPathExtension("lock"),
                      realmURL.appendingPathExtension("note"),
                      realmURL.appendingPathExtension("management"),
                      ]
                  for URL in realmURLs {
                      try? FileManager.default.removeItem(at: URL)
                  }
          let url = Realm.Configuration.defaultConfiguration.fileURL!
          remove(realmURL: url)
          

          清除数据库:

          try? realm.write {
              realm.deleteAll()
          }
          

          【讨论】:

          • 你错过了}正上方let url =...
          【解决方案7】:

          你试过了吗

             let realm = try! Realm()
             realm.deleteAllObjects() 
          

          您也可以尝试将领域从设备中删除,方法是将其插入计算机,进入 Xcode,然后进入设备,然后在那里找到当前领域并将其删除。

          【讨论】:

            【解决方案8】:

            虽然使用FileManager 对于非同步、非内存领域就足够了,但您可以使用Realm.deleteFiles(for:) 类方法删除给定配置的.realm.note.management 文件, 在 Realm v4.2.0 中引入。

            autoreleasepool {
                // Before deleting the files, guarantee
                // that all realm objects are deallocated.
                //
                // Deleting a realm file or any of its auxiliary files
                // while one or more instances of the realm are open,
                // might corrupt the realm or disrupt sync.
            }
            
            let configuration: Realm.Configuration = .defaultConfiguration
            
            do {
                // Returns `true` if the Realm file for the given
                // configuration exists on disk, `false` otherwise.
                if Realm.fileExists(for: configuration) {
                    // Returns `true` if any files were deleted, `false` otherwise.
                    _ = try Realm.deleteFiles(for: configuration)
                }
            } catch {
                // Handle error
            }
            

            当一个领域的所有实例都关闭时,您可以安全地删除这些文件。在删除领域文件之前,请确保备份所有重要对象,因为您将丢失领域中所有未同步的数据。

            有关删除领域文件的指导,请参考documentation

            【讨论】:

              猜你喜欢
              • 2018-10-23
              • 1970-01-01
              • 2016-05-31
              • 2021-10-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-12
              • 2015-08-29
              • 1970-01-01
              相关资源
              最近更新 更多