从 FMDB 数据库中获取数据
Fetch data from FMDB Database
在我的应用程序中,我想从 FMDB 数据库中获取数据以及我想发送给手表的数据。但问题是,当获取数据时,它不会在控制台中显示实际数据,如 ticket_type = Movie, time = 11:42 p.m。相反,它仅显示内存地址结果。
我的 TicketData 的源代码如下
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
}
}
我的应用程序的屏幕截图是
我的应用程序的屏幕截图
下面是我的源码
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(发件人: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)
}
}
ticketData 是一个对象,您正在尝试使用
打印对象
print("Data: \(ticketData)")
每当我们尝试打印对象时,总是会打印对象的内存地址,而不是对象的属性。如果要打印对象属性,像这样一一打印,
print("Data: \(ticketData.ticket_type)")
等等。如果你想一次打印所有内容,你可以做的是从结果集中获取一个字典对象并打印它。
print("Data:\(resultSet.resultDictionary())")
编辑:如何获取结果集的最后一个值。
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)")
}
更新:另外,我建议您阅读其 github 页面上的 FMDB 文档,并学习一些有关 FMDB 的教程,以编写更高效的数据库操作。也不要像 FMDB 的创建者所说的那样关闭数据库并为每个数据库操作打开数据库 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."
另外我建议你看看 FMDatabaseQueue。
希望对您有所帮助。
在我的应用程序中,我想从 FMDB 数据库中获取数据以及我想发送给手表的数据。但问题是,当获取数据时,它不会在控制台中显示实际数据,如 ticket_type = Movie, time = 11:42 p.m。相反,它仅显示内存地址结果。
我的 TicketData 的源代码如下
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
}
}
我的应用程序的屏幕截图是
我的应用程序的屏幕截图
下面是我的源码
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(发件人: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)
}
}
ticketData 是一个对象,您正在尝试使用
打印对象print("Data: \(ticketData)")
每当我们尝试打印对象时,总是会打印对象的内存地址,而不是对象的属性。如果要打印对象属性,像这样一一打印,
print("Data: \(ticketData.ticket_type)")
等等。如果你想一次打印所有内容,你可以做的是从结果集中获取一个字典对象并打印它。
print("Data:\(resultSet.resultDictionary())")
编辑:如何获取结果集的最后一个值。
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)")
}
更新:另外,我建议您阅读其 github 页面上的 FMDB 文档,并学习一些有关 FMDB 的教程,以编写更高效的数据库操作。也不要像 FMDB 的创建者所说的那样关闭数据库并为每个数据库操作打开数据库 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."
另外我建议你看看 FMDatabaseQueue。
希望对您有所帮助。