iOS / Swift - 使用App Groups访问共享数据库

时间:2017-07-24 09:36:53

标签: ios swift sqlite ios-app-group

我使用应用程序组功能在两个应用程序之间共享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

一开始。

哪里错了?

2 个答案:

答案 0 :(得分:2)

Runtime exceptionunexpectedly found nil while unwrapping an Optional value,发生:

  1. 当您unwrap an optional包含nil
  2. 当您使用implicitly unwrapped optional而未为其指定值时。
  3. 以下几行:

    var pathToDatabase: String!
    var fileMgr : FileManager!
    

    确保在使用之前已为pathToDatabasefileMgr分配了值。由于这两个变量为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)
}