2017-07-24 36 views
2

我使用应用程序组能够在两个应用程序之间共享SQLite数据库。iOS/Swift - 使用应用程序组访问共享数据库

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

和它的作品。

在斯威夫特我已经尝试过这种方式

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 exceptionunexpectedly found nil while unwrapping an Optional value,发生:

    当你 unwrap an optional包含 nil OR
  1. 当您使用implicitly unwrapped optional没有给它分配一个值

在下面几行:

var pathToDatabase: String! 
var fileMgr : FileManager! 

确保你使用它们之前已经分配价值pathToDatabasefileMgr。由于这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有价值,这样应用程序就不会崩溃。

0
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) 
} 
相关问题