我使用应用程序组功能在两个应用程序之间共享SQLite数据库。
现在我想从Objective-C迁移到Swift。
在Objective-C中获取数据库的路径
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSURL *groupContainerURL = [fileMgr containerURLForSecurityApplicationGroupIdentifier:@"<APP_GROUPS_ID>"];
NSString *groupContainerString = [groupContainerURL path];
NSString *sharedDB = [groupContainerString stringByAppendingPathComponent:dbFilename];
const char *dbPath = [sharedDB UTF8String];
它有效。
在Swift中,我试过这种方式
let groupContainerURL = fileMgr!.containerURL(forSecurityApplicationGroupIdentifier: "<APP_GROUPS_ID>")
let groupContainerString = groupContainerURL.path
pathToDatabase = groupContainerString.appending(databaseFileName)
我也宣布
let databaseFileName = "<DB_NAME>"
var pathToDatabase: String!
var fileMgr : FileManager!
但我发现此错误,关于可选值
fatal error: unexpectedly found nil while unwrapping an Optional value
2017-07-24 11:25:09.086974 CatchTheData[7941:4022839] fatal error: unexpectedly found nil while unwrapping an Optional value
一开始。
哪里错了?
答案 0 :(得分:2)
Runtime exception
:unexpectedly found nil while unwrapping an Optional value
,发生:
unwrap an optional
包含nil
或 implicitly unwrapped optional
而未为其指定值时。以下几行:
var pathToDatabase: String!
var fileMgr : FileManager!
确保在使用之前已为pathToDatabase
和fileMgr
分配了值。由于这两个变量为implicitly unwrapped optionals
,因此如果您在不指定值的情况下使用它们,则会导致runtime exception
类似于unexpectedly found nil while unwrapping an Optional value.
let groupContainerURL = fileMgr!.containerURL(forSecurityApplicationGroupIdentifier: "<APP_GROUPS_ID>")
在上面的代码行中,您使用的是fileMgr!
。首先不需要打开它。它是implicitly unwrapped
。只需确保fileMgr
具有值,以便应用不会崩溃。
答案 1 :(得分:0)
let databaseFileName = "<DB_NAME>"
var pathToDatabase: String!
var fileMgr : FileManager? //Your code crashes coz you hv declared fileMgr as non-optional but you hv'nt initialized it.
let AppGroupContainerUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "<APP_GROUPS_ID>")
if let groupContainerURL = AppGroupContainerUrl{
let groupContainerString = groupContainerURL.path
pathToDatabase = groupContainerString.appending(databaseFileName)
}