Dharma
Dharma

Reputation: 81

iOS SWIFT - SQLITE Query with parameter returns no data after iOS 16 upgrade. Same query returns data without parameters

An app developed in SWIFT in 2019 was working well until iOS 16 upgrade in November. I use SQLITE database and a few tables. Queries without parameters are working well, but the one with an input parameter returns no rows even though there is record in table (I can see it with full query of table). I have reproduced the code below. This is called as with input parameters as follows:

(requestSource: "All", cTrackingNumber: "0705632085943")

func queryAllReceiptTransaction(requestSource: String = "All", cTrackingNumber: String = "All") -> [[String: String]] {
    
    var queryAllReceiptStatement: OpaquePointer? = nil
    var queryAllReceiptStatementString: String = ""
    
    var vTrackingNumber: String = ""
    var vEmpID: String = ""
    var vCarrier: String = ""
    var vRecdLocation: String = ""
    var vRecdDate: String = ""
    var vRecdBy: String = ""
    var vDeliveryStatus: String = ""
    var vSite: String = ""
    var vUploadDate: String = ""
    var vUploadFlag: String = ""
    var vDownloadTrackingNumber: String = ""
    var vDownloadDate: String = ""
    var vDownloadFlag: String = ""
    var vAttribute1: String = ""
    var vAttribute2: String = ""
    var vAttribute3: String = ""
    var vAttribute4: String = ""
    var vAttribute5: String = ""
    
    var transHdrDictAll: [String: String] = [:]
    var transHdrArrayAll = Array<Dictionary<String, String>>()
    
    print(" Dec 2 - From queryAllReceiptTransaction method. cTrackingNumber = \(cTrackingNumber)")
    
    if cTrackingNumber == "All" {
        queryAllReceiptStatementString = "SELECT TRACKING_NUMBER,EMPLOYEE_ID, CARRIER, RECEIVED_LOCATION, RECEIVED_DATE, RECEIVED_BY, DELIVERY_STATUS, SITE, UPLOAD_DATE, UPLOAD_FLAG, DOWNLOAD_TRACKING_NUMBER, DOWNLOAD_DATE, DOWNLOAD_FLAG, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5 FROM BAE_MT_HEADER"
    } else if cTrackingNumber != "All" {
        queryAllReceiptStatementString = "SELECT TRACKING_NUMBER,EMPLOYEE_ID, CARRIER, RECEIVED_LOCATION, RECEIVED_DATE, RECEIVED_BY, DELIVERY_STATUS, SITE, UPLOAD_DATE, UPLOAD_FLAG, DOWNLOAD_TRACKING_NUMBER, DOWNLOAD_DATE, DOWNLOAD_FLAG, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5 FROM BAE_MT_HEADER WHERE TRACKING_NUMBER = ?"
    }

    if sqlite3_prepare_v2(db, queryAllReceiptStatementString, -1, &queryAllReceiptStatement, nil) == SQLITE_OK {
        if cTrackingNumber != "All" {
           if sqlite3_bind_text(queryAllReceiptStatement, 1, cTrackingNumber, -1, nil) != SQLITE_OK{
                let errorBind = String(cString: sqlite3_errmsg(db)!)
                print("Error while binding: \(errorBind)")
            }
       }

        while sqlite3_step(queryAllReceiptStatement) == SQLITE_ROW {

            let queryResultCol1 = sqlite3_column_text(queryAllReceiptStatement, 0)
            vTrackingNumber = String(cString: queryResultCol1!)
            
            let queryResultCol2 = sqlite3_column_text(queryAllReceiptStatement, 1)
            vEmpID = String(cString: queryResultCol2!)
            
            let queryResultCol3 = sqlite3_column_text(queryAllReceiptStatement, 2)
            vCarrier = String(cString: queryResultCol3!)
            
            let queryResultCol4 = sqlite3_column_text(queryAllReceiptStatement, 3)
            vRecdLocation = String(cString: queryResultCol4!)
            
            let queryResultCol5 = sqlite3_column_text(queryAllReceiptStatement, 4)
            vRecdDate = String(cString: queryResultCol5!)
            
            let queryResultCol6 = sqlite3_column_text(queryAllReceiptStatement, 5)
            vRecdBy = String(cString: queryResultCol6!)
            
            let queryResultCol7 = sqlite3_column_text(queryAllReceiptStatement, 6)
            vDeliveryStatus = String(cString: queryResultCol7!)
            
            let queryResultCol8 = sqlite3_column_text(queryAllReceiptStatement, 7)
            vSite = String(cString: queryResultCol8!)
            
            if let queryResultCol9 = sqlite3_column_text(queryAllReceiptStatement, 8) {
                vUploadDate = String(cString: queryResultCol9)
            }
            
            if let queryResultCol10 = sqlite3_column_text(queryAllReceiptStatement, 9) {
                vUploadFlag = String(cString: queryResultCol10)
            }

            if let queryResultCol11 = sqlite3_column_text(queryAllReceiptStatement, 10) {
                vDownloadTrackingNumber = String(cString: queryResultCol11)
            }
            if let queryResultCol12 = sqlite3_column_text(queryAllReceiptStatement, 11) {
                vDownloadDate = String(cString: queryResultCol12)
            }
            if let queryResultCol13 = sqlite3_column_text(queryAllReceiptStatement, 12) {
                vDownloadFlag = String(cString: queryResultCol13)
            }
            if let queryResultCol14 = sqlite3_column_text(queryAllReceiptStatement, 13) {
                vAttribute1 = String(cString: queryResultCol14)
            }
            if let queryResultCol15 = sqlite3_column_text(queryAllReceiptStatement, 14) {
                vAttribute2 = String(cString: queryResultCol15)
            }
            if let queryResultCol16 = sqlite3_column_text(queryAllReceiptStatement, 15) {
                vAttribute3 = String(cString: queryResultCol16)
            }
            if let queryResultCol17 = sqlite3_column_text(queryAllReceiptStatement, 16) {
                vAttribute4 = String(cString: queryResultCol17)
            }
            if let queryResultCol18 = sqlite3_column_text(queryAllReceiptStatement, 17) {
                vAttribute5 = String(cString: queryResultCol18)
            }
            
            transHdrDictAll["trackingNumber"]           = vTrackingNumber
            transHdrDictAll["employeeId"]           = vEmpID
            transHdrDictAll["carrier"]              = vCarrier
            transHdrDictAll["receivedLocation"]     = vRecdLocation
            transHdrDictAll["receivedDate"]         = vRecdDate
            transHdrDictAll["receivedBy"]           = vRecdBy
            transHdrDictAll["deliveryStatus"]       = vDeliveryStatus
            //transHdrDictAll["site"]                 = vSite
            //transHdrDictAll["uploadDate"]           = vUploadDate
            //transHdrDictAll["uploadFlag"]           = vUploadFlag
            //transHdrDictAll["downloadTrackingNumber"]   = vDownloadTrackingNumber
            //transHdrDictAll["downloadDate"]         = vDownloadDate
            //transHdrDictAll["downloadFlag"]         = vDownloadFlag
            //transHdrDictAll["attribute1"]           = vAttribute1
            //transHdrDictAll["attribute2"]           = vAttribute2
            //transHdrDictAll["attribute3"]           = vAttribute3
            //transHdrDictAll["attribute4"]           = vAttribute4
            //transHdrDictAll["attribute5"]           = vAttribute5
            //transHdrDictAll["week"]                 = weekBucket
            
            
            // append to array
            transHdrArrayAll.append(transHdrDictAll)
            //print(" Array details")
            //print(transHdrArrayAll)
            
            
            //vReturnStatus = true
        }
        /*

        sqlite3_reset(queryAllReceiptStatement)

    } else {
        print ("Query All Receipt Transactions: Error Preparing Query Statement BAE_MT_HEADER")
        let errorMessage = String.init(cString: sqlite3_errmsg(db))
        print("Error Message = \(errorMessage)")
    }
    sqlite3_finalize(queryAllReceiptStatement)
   return transHdrArrayAll
}

Output in MAC laptop

Successfully opened existing database at /var/mobile/Containers/Data/Application/FC1DB26B-AEDF-48F6-9F03-4A8797A227B2/Documents/MailTrackingDatabase2.sqlite Prtinting from app delegate.... Dec 2 - From queryAllReceiptTransaction method. cTrackingNumber = 0705632085943

[]


Note the two square brackets in the last line. Output is an array, but it comes as blank.

All table columns are defined as VARCHAR with varying sizes like 10,25, etc as needed.

Any help is appreciated

Upvotes: 0

Views: 331

Answers (1)

Dharma
Dharma

Reputation: 81

I resolved the issue with suggestion from @HangarRash to add SQLITE_TRANSIENT as parameter replacing nil. I also updated the iOS version to 16.1.2, which just popped up for installation.

Upvotes: 1

Related Questions