在Swift中复制Sqlite数据库不能正常工作

我正在使用以下代码的目标C复制SQLite数据库,它工作正常。 但是当我把这个代码转换成swift的时候,它在Booltypes上显示错误。

这是客观的C代码

- (void) copyDatabaseIfNeeded { //Using NSFileManager we can perform many file system operations. NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSString *dbPath = [self getDBPath]; BOOL success = [fileManager fileExistsAtPath:dbPath]; if(!success) { NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.sqlite"]; success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; if (!success) NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); } } - (NSString *) getDBPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; return [documentsDir stringByAppendingPathComponent:@"database.sqlite"]; } 

这是导致问题的Swift的CopyDataBase。

  var fileManager = FileManager.default var error: Error! var dbPath = self.getDBPath() var success = fileManager.fileExists(atPath: dbPath) if !success { var defaultDBPath = URL(fileURLWithPath: Bundle.main.resourcePath!).appendingPathComponent("CapalinoDataBase.sqlite").absoluteString do { success = try fileManager.copyItem(atPath: defaultDBPath, toPath: dbPath) } catch { } if !success { assert(false, "Failed to create writable database file with message '\(error.localizedDescription)'.") } } 

请试试这个。

 func copyDatabse() { let fileMgr = FileManager.default if let path = Bundle.main.path(forResource: "db", ofType:"sqlite") { do { try fileMgr.copyItem(atPath: path, toPath: dbPath()) print("Copy success") } catch { print(error.localizedDescription ) } } } func dbPath() -> String { let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true) let docsDir = dirPaths[0] let destPath = (docsDir as NSString).appendingPathComponent("/db.sqlite") return destPath } 

在swift中使用单个类的SQLIte的最佳方法。

下载示例

 func methodToCreateDatabase() -> NSURL? { let fileManager = NSFileManager.defaultManager() let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) if let documentDirectory:NSURL = urls.first { // No use of as? NSURL because let urls returns array of NSURL // exclude cloud backup do { try documentDirectory.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey) } catch _{ print("Failed to exclude backup") } // This is where the database should be in the documents directory let finalDatabaseURL = documentDirectory.URLByAppendingPathComponent("contact.db") if finalDatabaseURL.checkResourceIsReachableAndReturnError(nil) { // The file already exists, so just return the URL return finalDatabaseURL } else { // Copy the initial file from the application bundle to the documents directory if let bundleURL = NSBundle.mainBundle().URLForResource("contact", withExtension: "db") { do { try fileManager.copyItemAtURL(bundleURL, toURL: finalDatabaseURL) } catch _ { print("Couldn't copy file to final location!") } } else { print("Couldn't find initial database in the bundle!") } } } else { print("Couldn't get documents directory!") } return nil } 
 Please try this one it is working on swift 3.0 func copyDatabaseIfNeeded() { //Using NSFileManager we can perform many file system operations. let fileManager = FileManager.default let error: Error? let dbPath: String = self.getDBPath() var success: Bool = fileManager.fileExists(atPath: dbPath) if !success { let defaultDBPath: String = URL(fileURLWithPath: (Bundle.main.resourcePath)!).appendingPathComponent("database.sqlite").absoluteString do { success = try fileManager.copyItem(atPath: defaultDBPath, toPath: dbPath) as Any as! Bool } catch let error as NSError { print("Ooops! Something went wrong: \(error)") } if !success { assert(false, "Failed to create writable database file with message '\(error?.localizedDescription)'.") } } } func getDBPath() -> String { let paths: [Any] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) let documentsDir: String = paths[0] as! String return URL(fileURLWithPath: documentsDir).appendingPathComponent("database.sqlite").absoluteString }