2015-11-30 2 views
3

Мне нужно инициализировать переменную для подключения к базе данных SQLite в Swift. Я использую SQLite.swift библиотеку и необходимо подключиться к базе данных с этой строкой:Как объявить переменную подключения к базе данных глобально в Swift

let db = try Connection("path/to/db.sqlite3") 

Однако эта линия сама по себе не будет работать, потому что она должна быть окружена попытка/поймать блок. Try/уловах блоки не будут работать, если они не определены в методах или функций, так что теперь мы имеем

public func connectToDB() { 
    do { 
     let path = NSSearchPathForDirectoriesInDomains(
      .DocumentDirectory, .UserDomainMask, true 
      ).first! 
     let db = try Connection("\(path)/db.sqlite3") 
    } 
    catch { 
     print("error connecting to database") 
    } 
} 

Однако это не позволяет мне получить доступ к переменной из других методов в том же файле, что и Мне нужно сделать. Объявления Global let также требуют инициализации, поэтому это означает, что он не может быть установлен глобально. Как я могу получить доступ к этому объекту из других методов в классе?

+0

Прочитайте [это] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html). Особенно детали о 'scope' –

+0

В качестве альтернативы этому; создать объект менеджера баз данных и передать ссылку на него вокруг вашего приложения. Вы обнаружите, что это намного легче, когда дело доходит до тестирования вашего приложения. – Abizern

+0

Хорошо, я сделаю это. Спасибо! –

ответ

6

Вы можете сделать это:

let db = try! Connection("path/to/db.sqlite3") 
// db is a Connection but the app dies if there was an error. 

Или вы могли бы сделать это:

let db = try? Connection("path/to/db.sqlite3") 
// db is an Optional<Connection> and nil if there was an error. 

Или вы могли бы сделать это:

Вы можете делать все, что вам нравится в закрытие для обработки ошибки.

1

Я не уверен, почему ответ выше правильный - кажется, из первоначального вопроса, что у него было 2 проблемы, 1 использовал Try/Catch, а другой - SCOPE OF VARIABLE.

Если вы инициализируете переменную внутри функции, я понимаю, что она умирает с помощью функции. Я делаю это в своем коде следующим образом:

var db: FMDatabase?

func openDB() -> FMDatabase { 
    do { 
     let path = NSSearchPathForDirectoriesInDomains(
      .DocumentDirectory, .UserDomainMask, true 
      ).first! 
     let db = try Connection("\(path)/db.sqlite3") 
     return db 
    } 
    catch { 
     print("error connecting to database") 
     return nil 
    } 

} 

Теперь у вас будет доступ к «db» в качестве переменной класса. Надеюсь, это поможет.

+0

Упс, вам нужно удалить «let» db = try ... – user1082348

Смежные вопросы