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 exception
:unexpectedly found nil while unwrapping an Optional value
,发生:
- 当您
unwrap an optional
包含 nil
或
- 当您使用
implicitly unwrapped optional
而未为其赋值时。
在以下行中:
var pathToDatabase: String!
var fileMgr : FileManager!
确保在使用前已为 pathToDatabase
和 fileMgr
赋值。由于这 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
有价值,应用程序就不会崩溃。
我使用 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 exception
:unexpectedly found nil while unwrapping an Optional value
,发生:
- 当您
unwrap an optional
包含nil
或 - 当您使用
implicitly unwrapped optional
而未为其赋值时。
在以下行中:
var pathToDatabase: String!
var fileMgr : FileManager!
确保在使用前已为 pathToDatabase
和 fileMgr
赋值。由于这 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
有价值,应用程序就不会崩溃。