stephencelis / SQLite.swift

A type-safe, Swift-language layer over SQLite3.
MIT License
9.59k stars 1.55k forks source link

App crashes while doing background database operations #1042

Closed crspybits closed 1 year ago

crspybits commented 3 years ago

Build Information

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 commented 3 years ago

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 commented 3 years ago

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.

jberkel commented 2 years ago

@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.