将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中

Posted

技术标签:

【中文标题】将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中【英文标题】:Copy a Realm from Bundle to Documents, then read it into a local constant, in Swift 2.0 【发布时间】:2015-10-17 19:28:24 【问题描述】:

好的,我已经在我的 Swift 2.0 项目的捆绑包中构建了一个预填充的 Realm。我试图在首次启动时将其复制到我的 Documents 目录,然后从该位置读取并从那里使用它。看起来我已经写到 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 而不是字符串与文件系统进行交互,但 Realm 希望我给它path 作为细绳。这是一个棘手的问题。

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

【问题讨论】:

【参考方案1】:

尝试更改此设置

realm = try Realm(path: realmURL.absoluteString)

到这里

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

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

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

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

【讨论】:

不幸的是,这没有帮助。我正在查看path 给我的信息,它是:/Users/lukec/Library/Developer/CoreSimulator/Devices/063AB9C5-3482-4470-BD22-74B5014F5460/data/Containers/Data/Application/B4C176BA-AC7B-467D-B417-74FC03B3CF78/Documents/OohRealm.realm。那不应该是文档目录中的引用而不是磁盘上的绝对 URL 吗?不确定这是否正确。 你确定你的领域被成功复制了吗?你可能会得到nildefaultStorePath。尝试记录defaultStorePath的值,复制后检查目标文件是否存在。 哦,据我所知path 确实应该是绝对路径,以防 URL 识别文件。 @lukech 忘记通知你了。你的问题解决了吗?我在我的项目中尝试了您的代码,它使用path 而不是absoluteString 运行良好。我的猜测是您的领域文件不在主包中,因此 defaultStorePath 变为 nil 并且副本引发异常,您可以捕获并忽略该异常。 它实际上正在被读取,结果我有一个竞争条件并且它没有及时准备好进行查询,所以它显示为空。感谢您的建议!

以上是关于将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 从 Documents 目录中的 bundle 加载 xib

将多个文件复制到 Documents 目录

无法将目录从 Bundle 复制到库

iOS - 将特定图像从捆绑资源路径复制到 Documents Dir

Swift 3 文件复制错误

使用 NSSavePanel 将文件从 Bundle 保存/复制到桌面