Search code examples
iosswiftfmdb

Fetch data from FMDB Database


In my app, i want to fetch data from FMDB database and that data i want to send to watch. But the problem is that when the data is fetched, it doesn't show the actual data in console like ticket_type = Movie, time = 11:42 p.m. Instead it shows only memory address result.

The source code for my TicketData is below

class TicketData: NSObject {
var field1: String?
var field2: String?
var field3: String?
var field4: String?

override init() {
    super.init()
}

convenience init(field1: String, field2: String, field3: String, field4: String) {
   self.init()

        self.field1 = field1
        self.field2 = field2
        self.field3 = field3
        self.field4 = field4

}

}

The screenshot for my app is screenshot for my app image

My source code is below

class TicketDetailViewController: UIViewController, WCSessionDelegate {

var databasePath = NSString()
var holding_Ticket_category: String = ""
var holding_Image: UIImage?
var hold_ticketName: String = ""
var hold_ticketDate: String = ""
var hold_ticketTime: String = ""
var session: WCSession!
var ticketDataArray:[TicketData] = []


@IBOutlet weak var ticket_grey: UIImageView!
@IBOutlet weak var cropped_frame: UIImageView!
@IBOutlet weak var display_image: UIImageView!
@IBOutlet weak var ticket_type_name: UILabel!
@IBOutlet weak var ticket_date: UILabel!
@IBOutlet weak var ticket_time: UILabel!
@IBOutlet weak var ticket_category: UILabel!


override func viewDidLoad()
{
    super.viewDidLoad()

    if WCSession.isSupported(){
        self.session  = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
    }

    display_image.image = holding_Image
    ticket_type_name.text = hold_ticketName
    ticket_date.text = hold_ticketDate
    ticket_time.text = hold_ticketTime
    ticket_category.text = holding_Ticket_category

    let filemgr =  NSFileManager.defaultManager()
    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let docsDir = dirPaths[0]
    var ticketDB: FMDatabase

    databasePath = (docsDir as NSString).stringByAppendingPathComponent("ticket_Pass.sqlite")


    if !filemgr.fileExistsAtPath(databasePath as String)
    {

        ticketDB = FMDatabase(path: databasePath as String)
        if ticketDB.open()
        {

            let sql_stmt = "CREATE TABLE IF NOT EXISTS TICKET (ID INTEGER PRIMARY KEY AUTOINCREMENT, IMAGE TEXT, TICKET_CATEGORY TEXT, TICKET_TYPE TEXT, DATE TEXT, TIME TEXT)"
            if !ticketDB.executeStatements(sql_stmt)
            {
                print("Error: \(ticketDB.lastErrorMessage())")
            }
            ticketDB.close()
        } else
        {

            print("Error: \(ticketDB.lastErrorMessage())")
        }
    }
}

@IBAction func addTickets(sender: UIButton) {

    let ticketDB = FMDatabase(path: databasePath as String)
    if ticketDB.open()
    {

            let insertSQL = "INSERT INTO TICKET (image, ticket_category, ticket_type, date, time) VALUES ('\(display_image.image!)', '\(ticket_category.text!)', '\(ticket_type_name.text!)', '\(ticket_date.text!)', '\(ticket_time.text!)')"

            let result = ticketDB.executeUpdate(insertSQL,withArgumentsInArray: nil)

            if !result
            {

                print("Error: \(ticketDB.lastErrorMessage())")

            } else
            {

                let alt = PMAlertController(title: "Success!", description: "Your data is saved to Database!", image: UIImage(named: ""), style: .Alert)

                alt.addAction(PMAlertAction(title: "OK!", style: .Default, action: { (ACTION) -> Void in

                         self.navigationController?.popToRootViewControllerAnimated(true)

                }))

                        self.presentViewController(alt, animated: true, completion: nil)
                        print(databasePath)


           }
    }
}


@IBAction func deleteTickets(sender: UIButton) {
    let alt = PMAlertController(title: "Delete Ticket Details!", description: "Are you sure?", image: UIImage(named: ""), style: .Alert)

    alt.addAction(PMAlertAction(title: "Cancel", style: PMAlertActionStyle.Default, action: { (ACTION) -> Void in

        self.dismissViewControllerAnimated(true, completion: nil)

    }))
    alt.addAction(PMAlertAction(title: "OK", style: PMAlertActionStyle.Default, action: { (ACTION) -> Void in

        self.navigationController?.popToRootViewControllerAnimated(true)
    }))
    self.presentViewController(alt, animated: true, completion: nil)
}


@IBAction func sendToWatch(sender: AnyObject) {


    let ticketDB = FMDatabase(path: databasePath as String)
    if ticketDB.open()
    {

        let insertSQL = "INSERT INTO TICKET (image, ticket_category, ticket_type, date, time) VALUES ('\(display_image.image!)', '\(ticket_category.text!)', '\(ticket_type_name.text!)', '\(ticket_date.text!)', '\(ticket_time.text!)')"

        let result = ticketDB.executeUpdate(insertSQL,withArgumentsInArray: nil)

        if !result
        {

            print("Error: \(ticketDB.lastErrorMessage())")

        } else
        {

            let alt = PMAlertController(title: "Success!", description: "Your data is saved to Database!", image: UIImage(named: ""), style: .Alert)

            alt.addAction(PMAlertAction(title: "OK!", style: .Default, action:
                { (ACTION) -> Void in

                    let ticketDB = FMDatabase(path: self.databasePath as String)
                    if ticketDB.open()
                    {

                        let querySQL = "SELECT * FROM TICKET"

                        let result: FMResultSet? = ticketDB.executeQuery(querySQL, withArgumentsInArray: nil)

                        if let result = result
                        {

                           var ticketData = TicketData()
                            while (result.next() == true)
                            {
                                let image = result.stringForColumn("image")
                                let ticket_category = result.stringForColumn("ticket_category")
                                let ticket_type = result.stringForColumn("ticket_type")
                                let date = result.stringForColumn("date")
                                let time = result.stringForColumn("time")
                                ticketData = TicketData(field1: ticket_category!, field2: ticket_type!, field3: date!, field4: time!, field5: image!)
                                 self.ticketDataArray.append(ticketData)


                            }
                        print("Data: \(result.resultDictionary())")


                            }


                       }else
                       {
                            print("Error: \(ticketDB.lastErrorMessage())")

                       }

                    ticketDB.close()


                    }

            }))

            self.presentViewController(alt, animated: true, completion: nil)
            print(databasePath)

        }
    }

Solution

  • The ticketData is an object and you're trying to print an object using,

    print("Data: \(ticketData)")
    

    Whenever we try to print an object, always the object's memory address will be printed and not the object's properties. If you want to print the object properties, print it one by one like,

    print("Data: \(ticketData.ticket_type)")
    

    and so on. If you want to print everything at one shot, what you could do is you can get an dictionary object from the resultSet and print it.

    print("Data:\(resultSet.resultDictionary())")
    

    Edit: How to get the last value of the result set.

    if let result = result {
    
    var ticketData = TicketData()
    var latestTicketDict = [String: AnyObject]()
    
    while (result.next() == true) {
        let image = result.stringForColumn("image")
        let ticket_category = result.stringForColumn("ticket_category")
        let ticket_type = result.stringForColumn("ticket_type")
        let date = result.stringForColumn("date")
        let time = result.stringForColumn("time")
        ticketData = TicketData(field1: ticket_category!, field2: ticket_type!, field3: date!, field4: time!, field5: image!)
        self.ticketDataArray.append(ticketData)
        latestTicketDict = result.resultDictionary()
    }
    
    print("Data: \(latestTicketDict)")
    
    }
    

    Update: Also I would recommend you to go through the FMDB documentation on their github page and study some tutorials on FMDB to write more efficient DB operations. Also don't close the database and open the database for every db operation as the creator of the FMDB says When to close SQLite database (using FMDB) -

    "Keep it open unless you change your schema. That's the only reason to close it, and constantly re-opening it is a little hit on performance / battery life."

    Also I recommend you to take a look at FMDatabaseQueue.

    Hope this Helps.