iOS/Swift - доступ к общей базе данных с помощью групп приложений
Я использую возможность групп приложений для совместного использования базы данных SQLite между двумя приложениями.
Теперь я хочу перейти на Swift из Objective-C.
Чтобы получить путь к БД, в 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 ответа
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
имеет значение, чтобы приложение не зависало.
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)
}