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
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)
}
}
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.