【问题标题】:How to create a custom realm file如何创建自定义领域文件
【发布时间】:2017-02-01 10:56:25
【问题描述】:

我正在像这样初始化我的领域实例:

private static let sUserRealm:Realm = try! Realm(configuration:Realm.Configuration(
        fileURL: Bundle.main.url(forResource: "user" ,withExtension: "realm"),
        inMemoryIdentifier: nil,
        syncConfiguration: nil,
        encryptionKey: nil,
        readOnly: false,
        schemaVersion: 0,
        migrationBlock: sMigrationBlock,
        deleteRealmIfMigrationNeeded: true,
        objectTypes: nil))

但是,我遇到了这个错误:

fatal error: A Realm Configuration must specify a path or an in-memory 
identifier.: file /Users/realm/workspace/Package iOS Swift/tightdb_objc/RealmSwift/RealmConfiguration.swift, line 201

所有领域在其关于创建多个领域的快速文档中都有this 示例,即使逐字复制也会引发相同的错误。如何创建和访问领域文件?

【问题讨论】:

    标签: ios realm realm-mobile-platform


    【解决方案1】:

    Swift 5:

    只需自定义您的领域文件的名称

    struct Kingdom {
        static let persist = Kingdom()
    
        let realm: Realm = { () -> Realm in
            var config = Realm.Configuration()
            config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("deng.realm")
            let land = try! Realm(configuration: config)
            return land
        }()
    }
    

    自定义您的领域文件的名称和路径

    struct Kingdom {
        static let persist = Kingdom()
    
        let realm: Realm = { () -> Realm in
            let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
            let documentsDirectory = paths[0]
            let docURL = URL(string: documentsDirectory)!
            let dataPath = docURL.appendingPathComponent("Dng")
            if FileManager.default.fileExists(atPath: dataPath.absoluteString) == false{
                do {
                    try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
                } catch {
                    print(error.localizedDescription)
                }
            }
            do {
                var config = Realm.Configuration()
                config.fileURL = dataPath.appendingPathComponent("deng.realm")
                let realmReal = try Realm(configuration: config)
                return realmReal
            } catch {
                print(error.localizedDescription)
                let realmForSyntax = try! Realm()
                return realmForSyntax
            }
        }()
    }
    

    【讨论】:

      【解决方案2】:

      Bundle.url(forResource:withExtension:) 返回给定包中现有文件的路径。您链接到的领域文档部分使用了在您的应用程序包中包含领域文件的示例。

      由于您似乎正试图在特定路径上创建一个 Realm 文件,您应该计算该路径并将其设置为Realm.Configuration 上的fileURL。您通常不想为此使用Bundle API,因为您的应用程序包中的文件不可写。相反,您应该构建一个相对于您应用的文档或缓存目录的路径:

      let documentDirectory = FileManager.default.url(for: .documentDirectory, in: .userDomainMask,
                                                      appropriateFor: nil, create: false)
      let url = documentDirectory.appendingPathComponent("my-new-realm.realm")
      

      【讨论】:

      • 但如果您在应用程序包中包含领域文件,won't it be read only?
      • 是吗?如果您的应用程序包中有一个 Realm 文件要写入,您需要先将其复制到可写的位置。如果您不使用作为应用程序包的一部分包含的 Realm 文件,请构建一个指向文档或缓存目录的路径。
      【解决方案3】:

      这是一个示例 Realm 配置类,每个配置创建一个新的 Realm 文件。

           import Foundation
           import RealmSwift
      
           class RealmConfiguration {
      
      // Create "default.realm" in document file
              public static var defaultDataConfiguration = Realm.Configuration.defaultConfiguration
      
      // Create "insensitive.realm"
              static func insensitiveDataConfiguration() -> Realm.Configuration {
                  var config = Realm.Configuration()
                  config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("insensitive.realm")
                  return config
              }
      
      // Create "sensitive.realm"
              static func sensitiveDataConfiguration() -> Realm.Configuration {
                  var config = Realm.Configuration()
                  config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("sensitive.realm")
                  return config
              }
          }
      

      【讨论】:

      • 我用过这个但是没有一个在今天的扩展中不起作用
      • 我在使用它时实际上没有错误,但它只能在应用程序和扩展程序中工作,我无法访问该文件,它就像没有文件一样处理
      • 我需要看代码,我不知道你的问题。
      • 如果你愿意,我可以让你在团队查看器中查看我的代码
      • 不,我没有足够的时间,对不起,提出一个新问题并在这里分享,或者把你的代码放在这里
      【解决方案4】:

      使用 Bundle.main.url(forResource: "user" ,withExtension: "realm")! 但这个值可能是 nil 因为你的文件不存在

      而不是 Bundle.main.url(forResource: "user" ,withExtension: "realm")

      小心设置

      编辑

      要使用预定义的数据库,您可以使用Bundle

      但如果您想为您的应用使用新数据库,请使用其他路径。不捆绑。

      https://realm.io/docs/swift/latest/

      var config = Realm.Configuration()
      
        // Use the default directory, but replace the filename with the username
        config.fileURL = config.fileURL!.deletingLastPathComponent()
                               .appendingPathComponent("\(username).realm")
      

      sUserRealm:Realm = try! Realm(configuration:config)

      或您想要的任何路径,但不是Bundle

      创建和编辑文件和目录:

      let fileManager:FileManager = FileManager.default
              let documentdir:String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!
      
              let dbName = someDataBaseFileName
      
              let yourFullFileName = String(format:"%@/%@",documentdir,dbName)
      

      //或

      let yourFullPath:String = URL(fileURLWithPath: documentdir).appendingPathComponent(dbName).path
      

      【讨论】:

      • Bundle.main.url(forResource: "user" ,withExtension: "realm") 返回 nil,所以会抛出错误
      • 所以,这就是答案。你通过nil 值喂Realm
      • 不是答案。问题是“我如何创建和访问领域文件?”我们现在知道我为领域提供 nil 值的事实并不能满足这个问题
      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2023-03-20
      相关资源
      最近更新 更多