SQLite.swift icon indicating copy to clipboard operation
SQLite.swift copied to clipboard

App crashes while doing background database operations

Open crspybits opened this issue 4 years ago • 3 comments

Build Information

  • Include the SQLite.swift version, commit or branch experiencing the issue. 0.12.2

  • Mention Xcode and OS X versions affected. iOS 14, Xcode 12.4

  • How do do you integrate SQLite.swift in your project?

  • Swift Package manager

I am deploying test builds of my app on TestFlight. The app is designed to use background URLSession's to do uploading/downloading from a server while the app is in the background.

I'm fairly regularly getting crashes of the app when it goes into the background. Crash reports in Xcode are indicating this is occurring in SQLite code. Here are two examples:

Screen Shot 2021-03-13 at 12 42 17 PM Screen Shot 2021-03-13 at 12 42 44 PM

I have taken the step of removing security access on the file being used by the database:

extension URL {
    func enableAccessInBackground() {
        /* By default, the NSFileProtectionKey is NSFileProtectionCompleteUntilFirstUserAuthentication and I think this is causing app crashes when it goes into the background.
         */
        let attributes = [ FileAttributeKey.protectionKey : FileProtectionType.none ]
        do {
            try FileManager.default.setAttributes(attributes, ofItemAtPath: path)
            let attr = try FileManager.default.attributesOfItem(atPath: path)
            logger.debug("SQLite db: attr: \(attr)")
        } catch let error {
            logger.error("\(error)")
        }
    }
}

Any ideas?

crspybits avatar Mar 13 '21 19:03 crspybits

Searching for this issue, I'm finding others recommend not keeping your SQLite database in a shared group container. Which is something I'm doing. See: https://inessential.com/2020/02/13/how_we_fixed_the_dreaded_0xdead10cc_cras

crspybits avatar Mar 13 '21 19:03 crspybits

I'm wondering why the Connection constructor doesn't let you pass flags. E.g., it seems important that I be able to pass the flag SQLITE_OPEN_FILEPROTECTION_NONE.

crspybits avatar Mar 13 '21 20:03 crspybits

@crspybits so looks like there's not much which can be done on the library side? (other than adding this information to the documentation).

regarding your last point (pass flags for opening), that sounds like a good suggestion, we should open a separate issue for this.

jberkel avatar Aug 24 '21 14:08 jberkel