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, происходит:

  1. когда ты unwrap an optional который содержит nil ИЛИ ЖЕ
  2. когда вы используете 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)
}
Другие вопросы по тегам