2017-01-10 84 views
0

我正在使用以下代碼來複制sqlite數據庫,並且它工作正常。但是,當我將此代碼轉換爲swift時,它會在Bool類型上顯示錯誤。在Swift中複製Sqlite數據庫無法正常工作

這是客觀的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"]; 
    } 

這是這是造成問題的雨燕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)'.") 
    } 
     } 

回答

0

請試試這個。

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 
    } 
0

在swift中使用單個類的SQLIte的最佳方法。

Download example

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 
} 
0
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 
} 
相關問題