我想将 (Salary.db) 连接到我的 iOS (Swift) 项目 并从数据库中获取数据?
第一步,如何在 Swift 3 中连接现有数据库?
let fileURL = try! FileManager.default
.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("Salary.db")
guard let database = FMDatabase(path: fileURL.path) else {
print("unable to create database")
return
}
guard database.open() else {
print("Unable to open database")
return
}
FMDB 是一个很棒的 Objective-C 库,但尚未针对 Swift 进行更新,有时在 Swift 中感觉很尴尬。
您可以考虑使用像 GRDB.swift 这样的库,它是用 Swift 编写的,健壮,快速,并为您提供与 FMDB 相同的功能:
import GRDB
// GRDB's DatabaseQueue is similar to FMDB's FMDatabaseQueue
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
try dbQueue.inDatabase { db in
// Same as FMDB's -[FMDatabase executeUpdate:withArgumentsInArray:]
try db.execute(
"INSERT INTO pointOfInterests (title, favorite, latitude, longitude) " +
"VALUES (?, ?, ?, ?)",
arguments: ["Paris", true, 48.85341, 2.3488])
// Same as FMDB's -[FMDatabase executeQuery:] and FMResultSet
let rows = try Row.fetchCursor(db, "SELECT * FROM pointOfInterests")
while let row = try rows.next() {
let title: String = row.value(named: "title")
let isFavorite: Bool = row.value(named: "favorite")
let coordinate = CLLocationCoordinate2DMake(
row.value(named: "latitude"),
row.value(named: "longitude"))
}
}
GRDB 还允许您在不需要时避免编写 SQL。请参阅 README.md 了解更多信息。
这是 swift 中 SQLite 的最佳教程
http://www.appcoda.com/fmdb-sqlite-database/
https://www.raywenderlich.com/123579/sqlite-tutorial-swift
在 Github 上获取完整项目:单击此处
这是我的代码:
模型管理器.swift
import UIKit
import FMDB
let sharedInstance = ModelManager()
class ModelManager: NSObject {
var database: FMDatabase? = nil
var dbPath:String? = nil
class func getInstance() -> ModelManager
{
if(sharedInstance.database == nil)
{
let documentsPath1 = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
let logsPath = documentsPath1.appendingPathComponent("datadb")
let dbpath = logsPath?.appendingPathComponent("test.db")
sharedInstance.database = FMDatabase(path:dbpath?.path)
}
return sharedInstance
}
func getUserProfile() -> Dictionary<String, String> {
sharedInstance.database!.open()
let strQuery = "select * from tbl_UserProfile limit 1"
let resultSet: FMResultSet! = sharedInstance.database!.executeQuery(strQuery, withArgumentsIn: nil)
var dict:Dictionary<String, String> = [:]
if (resultSet != nil) {
while resultSet.next() {
dict = resultSet.resultDictionary() as! [String : String]
}
}
return dict as Dictionary<String, String>
}
}
SidePanelVC.swift
import UIKit
class SidePanelVC: UIViewController,UITableViewDataSource,UITableViewDelegate{
@IBOutlet weak var lblWelcomeMsg: UILabel!
override func viewDidLoad() {
self.setUserProfile()
}
func setUserProfile() {
let userProfile = ModelManager.getInstance().getUserProfile()
let userName:String = userProfile["FullName"] ?? "empty"
lblWelcomeMsg.text = userName
}
}
导入FMDB
让共享:DBManager = DBManager()
DBManager 类:NSObject {
//Variables..
var db = FMDatabase()
var databasePath = String()
override init()
{
super.init()
let success:Bool
let fileManager = FileManager.default
success = fileManager.fileExists(atPath: dbPath().0)
if !success {
let databasePathFromApp = Bundle.main.path(forResource: "Teletrack", ofType: "db")
do {
try fileManager.copyItem(atPath: databasePathFromApp!, toPath: dbPath().0)
} catch let error as NSError
{
if isPrintValue
{
print("Error: \(error.localizedDescription)")
}
}
}
db = FMDatabase.init(path: dbPath().0)
db.open()
print("DB Path_\(dbPath().0)")
if db.open(){
//print("DB Open")
}else{
// print("DB Close")
}
}
func dbPath() -> (String, URL)
{
let documentURl = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL.fileURL(withPath: documentURl)
let fileurl = url.appendingPathComponent("Teletrack.db")
let filePath = fileurl.path as String
return (filePath, url)
}
func closeDB() -> Void
{
db.close()
}
deinit {
}
}