将领域从 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
,而我的realm
是nil
:
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!)
NSUrl
s 用于表示通用 URL,并且可以引用文件以外的内容。 absoluteString
属性还可以标识此 URL 在前缀中的资源类型。对于文件,它以前缀file://
开头。此前缀字符串不适用于NSFileManager
或NSPathUtilities
等文件系统库。显然它也不适合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 吗?不确定这是否正确。
你确定你的领域被成功复制了吗?你可能会得到nil
为defaultStorePath
。尝试记录defaultStorePath
的值,复制后检查目标文件是否存在。
哦,据我所知path
确实应该是绝对路径,以防 URL 识别文件。
@lukech 忘记通知你了。你的问题解决了吗?我在我的项目中尝试了您的代码,它使用path
而不是absoluteString
运行良好。我的猜测是您的领域文件不在主包中,因此 defaultStorePath
变为 nil
并且副本引发异常,您可以捕获并忽略该异常。
它实际上正在被读取,结果我有一个竞争条件并且它没有及时准备好进行查询,所以它显示为空。感谢您的建议!以上是关于将领域从 Bundle 复制到 Documents,然后将其读入本地常量,在 Swift 2.0 中的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 从 Documents 目录中的 bundle 加载 xib