swiftsqlitefilepathlocal-database

Trouble fetching database path


Integrated SQLITE Database, below is my code which I have written,

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
        self.copyDatabaseIfNeeded()
        return true
}

func copyDatabaseIfNeeded() {
    let fileManager = FileManager.default
    let dbPath = getDBPath()
    var success: Bool = fileManager.fileExists(atPath: dbPath!)
    if !success {
        let defaultDBPath = URL(fileURLWithPath: Bundle.main.resourcePath ?? "").appendingPathComponent(APPLICATION_DB).absoluteString
        success = ((try?fileManager.copyItem(atPath: defaultDBPath, toPath: dbPath!)) != nil)
        if !success {
            print("Failed to create writable database!")
        }
    }
}

func getDBPath() -> String? {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDir = paths[0]
        return URL(fileURLWithPath: documentsDir).appendingPathComponent(APPLICATION_DB).absoluteString
}

It always print below output,

enter image description here

none of the above has worked.

Also, my sqlite file is there in project target -> Build Phases -> Copy Bundle Resources : below screenshot for reference.

enter image description here

I am not sure whether hierarchy of my file matters or not, attaching screenshot of that as well.

enter image description here

Can anyone help me why I am getting issue in fetching file path of my database file?


Solution

  • Try this.

    func copyDatabaseIfNeeded() {
        // Move database file from bundle to documents folder
    
        let fileManager = FileManager.default
    
        let documentsUrl = fileManager.urls(for: .documentDirectory,
                                                    in: .userDomainMask)
    
        guard documentsUrl.count != 0 else {
            return // Could not find documents URL
        }
    
        let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("SQL.sqlite")
    
        if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
            print("DB does not exist in documents folder")
    
            let documentsURL = Bundle.main.resourceURL?.appendingPathComponent("SQL.sqlite")
    
            do {
                  try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path)
                  } catch let error as NSError {
                    print("Couldn't copy file to final location! Error:\(error.description)")
            }
    
        } else {
            print("Database file found at path: \(finalDatabaseURL.path)")
        }
    
    }