将一个Realm从Bundle复制到Documents,然后在Swift 2.0中将其读入一个局部常量

时间:2015-10-17 19:28:24

标签: ios swift2 realm

好的,所以我有一个预先填充的Realm,我是在Swift 2.0项目的捆绑中构建的。我正在尝试在首次启动时将其复制到我的Documents目录,然后从该位置读取并从那里使用它。看起来我写下了文档,但是Realm不会读入我的let。这是我如何保存它(这会在磁盘上创建文件,所以我认为一切都很好):

final func copyEmptyDatabaseIfRequired() {
    let documentsPath: AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask,true).first!
    let storePath: String = documentsPath.stringByAppendingPathComponent("OohRealm.realm")

    if !NSFileManager.defaultManager().fileExistsAtPath(storePath) {
        let defaultStorePath : String! = NSBundle.mainBundle().pathForResource("OohRealm", ofType: "realm")
        do {
            try NSFileManager.defaultManager().copyItemAtPath(defaultStorePath, toPath: storePath)
        } catch _ {
            // Handle nasty goings-on later. No really.
        }
    }
}

以下是我在我的数据管理器中尝试将该文件读入本地let的方式(这是不起作用的,我点击了catch和我的realmnil

let fileManager = NSFileManager.defaultManager()
let documentsURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
let realmURL = documentsURL.URLByAppendingPathComponent("OohRealm.realm")

do {
    realm = try Realm(path: realmURL.absoluteString)
} catch {
    //
}

我遇到的一个绊脚石似乎是在Swift 2.0中,Apple真的希望你使用URL而不是Strings与文件系统进行交互,但是Realm希望我给它path作为一个字符串。这是一个棘手的问题。

我可能在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

尝试更改此

realm = try Realm(path: realmURL.absoluteString)

到这个

realm = try Realm(path: realmURL.path!)

NSUrl用于表示通用URL,可以引用文件以外的内容。 absoluteString属性还可以标识此URL在前缀中的资源类型。对于文件,它以前缀file://开头。此前缀字符串不适合与NSFileManagerNSPathUtilities等文件系统库一起使用。显然它也不适合Realm

如果您知道自己正在处理文件URL,NSUrl会为您提供path属性,该属性是文件的绝对路径,适用于文件系统库。

正如一句话,文件系统库是path的用途之一,但不是唯一目的。