【问题标题】:iOS/Swift - Accessing shared DB using App GroupsiOS/Swift - 使用 App Groups 访问共享数据库
【发布时间】:2017-07-24 09:36:53
【问题描述】:

我使用 App Groups 在两个应用程序之间共享 SQLite DB 的能力。

现在我想从 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!

但是我有这个错误,关于 Optional Value

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

一开始。

我哪里错了?

【问题讨论】:

    标签: ios swift sqlite ios-app-group


    【解决方案1】:

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

    1. 当你unwrap an optional 包含nil OR
    2. 当您使用 implicitly unwrapped optional 而不为其分配值时。

    在以下几行中:

    var pathToDatabase: String!
    var fileMgr : FileManager!
    

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

    【讨论】:

      【解决方案2】:
      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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 2016-12-13
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 2020-10-12
        相关资源
        最近更新 更多