iOS/Swift - 使用应用组访问共享数据库

iOS/Swift - Accessing shared DB using App Groups

我使用 App Groups 功能在两个 App 之间共享 SQLite 数据库。

现在我想从 Objective-C 迁移到 Swift。

获取DB的路径,在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

开头。

我哪里错了?

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)
}

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

  1. 当您 unwrap an optional 包含 nil
  2. 当您使用 implicitly unwrapped optional 而未为其赋值时。

在以下行中:

var pathToDatabase: String!
var fileMgr : FileManager!

确保在使用前已为 pathToDatabasefileMgr 赋值。由于这 2 个变量是 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 有价值,应用程序就不会崩溃。