我正在开发iOS应用程序,我想为它设置一个关系数据库。我读到SQLite是一个很好用的数据库。我在Swift中制作应用程序。我看了几个教程,但似乎我找到的所有教程都有ObjectiveManager中的DBManager类或库。因此,我需要db类的包装器。我不确定包装器是如何工作的以及我如何使用swift语法调用objective-c方法。
我想知道是否有人可以帮助澄清整个过程,从创建数据库文件并将其添加到您的xcode项目以使用具有快速语法的objective-c库来运行对数据库文件的查询。
另外,使用似乎更容易使用的核心数据是否值得呢?
答案 0 :(得分:14)
Objective-C教程仍然或多或少相关,但显然不会带来特定于Swift的细节(目前,正如另一位评论者所推荐的那样,FMDB也不会)。我最后写了SQLite.swift来利用Swift的一些更有趣的方面(类型安全和泛型,选项):
https://github.com/stephencelis/SQLite.swift
SQLite.swift提供了编译时的安全性/置信度,并且不再需要大量的错误处理。语句和表达式是在Swift中构建的,因此不太可能出现运行时SQL语法错误。
See the documentation有关创建数据库文件及其存储位置的更多信息(根据您的需要):
就核心数据而言,它(与此答案时的大多数Apple库一样)并没有利用Swift,但拥有丰富的遗产,可能是最佳选择,特别是对于较小的持久对象图。但是,如果您想要控制关系数据库,或者您计划存储经常更改的大型数据集,您可能会对Core Data(以及您需要获得的特定于域的知识)感到沮丧,/ p>
答案 1 :(得分:1)
我自己一步一步地按照techtopia的说明进行了很好的解释。
http://www.techotopia.com/index.php/Swift_iOS_8_Database_Implementation_using_SQLite
http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_8_Application_using_Swift_and_FMDB
它使用FMDB包装器。
创建数据库和表格
override func viewDidLoad() {
super.viewDidLoad()
let filemgr = NSFileManager.defaultManager()
let dirPaths =
NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
.UserDomainMask, true)
let docsDir = dirPaths[0] as! String
databasePath = docsDir.stringByAppendingPathComponent(
"contacts.db")
if !filemgr.fileExistsAtPath(databasePath as String) {
let contactDB = FMDatabase(path: databasePath as String)
if contactDB == nil {
println("Error: \(contactDB.lastErrorMessage())")
}
if contactDB.open() {
let sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)"
if !contactDB.executeStatements(sql_stmt) {
println("Error: \(contactDB.lastErrorMessage())")
}
contactDB.close()
} else {
println("Error: \(contactDB.lastErrorMessage())")
}
}
}
上述方法中的代码执行以下任务:
- 标识应用程序的Documents目录并构造contacts.db数据库文件的路径。
- 创建NSFileManager实例,然后使用它来检测数据库文件是否已存在。
- 如果该文件尚不存在,则代码通过创建使用数据库文件路径初始化的FMDatabase实例来创建数据库。如果数据库创建成功,则通过调用新数据库实例的open方法打开它。
- 准备SQL语句以在数据库中创建contacts表,并通过调用数据库实例的FMDB executeStatements方法来执行它。
- 关闭数据库。
将数据保存到数据库
@IBAction func saveData(sender: AnyObject) {
let contactDB = FMDatabase(path: databasePath as String)
if contactDB.open() {
let insertSQL = "INSERT INTO CONTACTS (name, address, phone) VALUES ('\(name.text)', '\(address.text)', '\(phone.text)')"
let result = contactDB.executeUpdate(insertSQL,
withArgumentsInArray: nil)
if !result {
status.text = "Failed to add contact"
println("Error: \(contactDB.lastErrorMessage())")
} else {
status.text = "Contact Added"
name.text = ""
address.text = ""
phone.text = ""
}
} else {
println("Error: \(contactDB.lastErrorMessage())")
}
}
来自数据库的FETCH数据
@IBAction func findContact(sender: AnyObject) {
let contactDB = FMDatabase(path: databasePath as String)
if contactDB.open() {
let querySQL = "SELECT address, phone FROM CONTACTS WHERE name = '\(name.text)'"
let results:FMResultSet? = contactDB.executeQuery(querySQL,
withArgumentsInArray: nil)
if results?.next() == true {
address.text = results?.stringForColumn("address")
phone.text = results?.stringForColumn("phone")
status.text = "Record Found"
} else {
status.text = "Record not found"
address.text = ""
phone.text = ""
}
contactDB.close()
} else {
println("Error: \(contactDB.lastErrorMessage())")
}
}
答案 2 :(得分:0)
您可以使用this project中包含的sqlite包装器。它是用Objective-C编写的,但它可以很容易地在Swift中使用。
答案 3 :(得分:0)
Swift 3的另一个SQLite包装器:http://github.com/groue/GRDB.swift
它提供:
对于着名的Objective-C FMDB(https://github.com/ccgus/fmdb)
利用Swift标准库的低级SQLite API。
适用于SQL过敏开发者的漂亮Swift查询界面
支持SQLite WAL模式和并发数据库访问以获得额外性能
一个记录类,它包装结果集,吃早餐的自定义SQL查询,提供持久性操作和更改跟踪。
Swift类型自由:选择适合您数据的Swift类型。需要时使用Int64,或坚持使用方便的Int。存储和读取NSDate或NSDateComponents。为离散数据类型声明Swift枚举。定义您自己的数据库可转换类型。
数据库迁移