测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布上次发布 | 2017年9月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Chelemen Razvan 维护。
SQLiteDB 是一个简单的轻量级 Swift SQLite 包装器。它允许所有基本 SQLite 功能,包括能够在 SQL 语句中将值绑定到参数。您可以包含一个 SQLite 数据库文件到您的项目中(如果您想要预加载数据),并将其自动复制进您的文档文件夹,或者让 SQLiteDB 自动为您创建所需的数据库和相关的表结构。
更新:(2017年4月11日) SQLiteDB 的最新版本有了指定数据库名字(默认为“data.db”)的选项,因此在您运行任何查询或执行命令之前,您必须通过调用 openDB()
明确打开数据库。更新现有项目时,请注意此更改。(请参见包含的 iOS 示例项目的 AppDelegate.swift
文件以获取示例。)
注意:如果您是 Swift 新手或没有麻烦过阅读 Swift 文档,请不要要求我解释 Swift 功能。相反,请阅读一些有关 Swift 功能的内容,因为关于此主题有很多出色的文档。另一方面,如果您不寻求免费建议,但愿意为我付费,请随时联系我 :)
如果您想预先加载数据或预先创建表结构和索引,或者如果您不是使用 SQLTable
子类,而直接使用 SQLiteDB
,那么您需要创建一个 SQLite 数据库文件并将其包含到您的项目中。
按照任何方式创建您的 SQLite 数据库,但是将其命名为 data.db
,然后将 data.db
文件添加到您的 Xcode 项目中。(如果您想将数据库文件命名为除了 data.db
之外的内容,那么需要根据相应地设置 SQLiteDB
类中的 DB_NAME
属性。)
注意:请记住,当您将数据库文件添加到项目中时,将其添加到应用程序目标。如果不将数据库文件添加到项目目标,则它不会与其他项目资源一起复制到设备。
如果您不想预加载数据并且正在使用 SQLTable
子类来访问您的表,您可以跳过上述步骤,因为如果数据库文件没有被包含在项目中,SQLiteDB 会自动为您创建表结构。但是,为了使其工作,您需要在调用时,将 false
作为参数传递给 openDB
方法,如下所示
db.openDB(copyFile:false)
将所有包含的源文件(当然不包括 README.md)添加到您的项目中。
如果您没有桥接头文件,请使用包含的 Bridging-Header.h
文件。如果您已经有了桥接头文件,那么将 Bridging-Header.h
文件的内容复制到您自己的桥接头文件中。
如果您没有桥接头文件,请确保您修改了项目设置以指向新的桥接头文件。这将在目标的 Build Settings 下,并命名为 Objective-C Bridging Header。
将 SQLite 库(libsqlite3.0.dylib 或 libsqlite3.tbd,取决于您的 Xcode 版本)添加到您的项目中,在 Build Phases - Link Binary With Libraries 部分下。
就是这样。您已经设置完毕!
您有两种方法可以在项目中使用 SQLiteDB
:
您可以直接使用 SQLiteDB
类来获取数据库的引用,然后直接在数据库上运行查询(或执行语句)。
您可以通过以下方式访问共享的数据库实例:
let db = SQLiteDB.shared
在您进行任何 SQL 查询或执行命令之前,您应该打开 SQLite 数据库。在大多数情况下,这需要在每个应用中只进行一次,所以您可以在您的 AppDelegate
中这样做,例如
db.openDB()
您可以使用 query
方法进行 SQL 查询(结果以返回字典数组的形式,键为 String
,值为 Any
类型)
let data = db.query(sql:"SELECT * FROM customers WHERE name='John'")
let row = data[0]
if let name = row["name"] {
textLabel.text = name as! String
}
在上面的例子中,db
是共享的 SQLite 数据库实例的引用。您可以通过基于列名对返回结果的行(这些行是字典)进行索引来访问查询结果中的列。这将返回一个可选的 Any
值,您可以将其转换为相关数据类型。
如果您宁愿将值绑定到查询而不是创建完整的 SQL 语句,则也可以像这样执行上面的 SQL
let name = "John"
let data = db.query(sql:"SELECT * FROM customers WHERE name=?", parameters:[name])
当然,您也可以使用 Swift 的字符串操作功能来构造上面的 SQL 查询,而不使用 SQLite 绑定功能
let name = "John"
let data = db.query(sql:"SELECT * FROM customers WHERE name='\(name)'")
您可以使用 execute
方法执行所有非查询 SQL 命令(INSERT、DELETE、UPDATE 等)
let result = db.execute(sql:"DELETE FROM customers WHERE last_name='Smith'")
// If the result is 0 then the operation failed, for inserts the result gives the newly inserted record ID
以前在 SQLiteDB 中可用的 esc
方法不再存在。因此,例如,如果您需要转义包含引号的字符串,您应该使用上面显示的 SQLite 参数绑定功能。
SQLTable
如果您希望将数据库表建模为类,并通过类进行任何数据访问,SQLiteDB 还提供了一个可以为您做大部分体力劳动的 SQLTable
类。
如果您创建 SQLTable
的子类,定义与您的 SQLite 表中列名匹配的属性,然后您可以使用子类保存到/更新数据库,而无需自己编写所有必要的样板代码。
此外,使用这种方法,您不需要将 SQLite 数据库项目包含在您的应用中(除非您想)。SQLiteDB 会根据您的 SQLTable
子类推断表的架构,并在必要时自动为您创建必要的表。
例如,假设您有一个只有一个id
和name
两列的Categories
表。然后,表的SQLTable
子类定义将大致如下
class Category:SQLTable {
var id = -1
var name = ""
}
就是这么简单!您不用编写任何插入、更新或删除方法,因为SQLTable
在幕后为您处理所有这些。
注意:请注意,对于名为Categories
的表,类必须命名为Category
—— 表名必须是复数,类名必须是单数。
当您使用SQLTable
子类,并希望自动为您创建表结构时,您需要做的唯一额外的事 là 在调用openDB
时指定您不想在项目资源中创建数据库的副本。因此,您的openDB
命令必须是以下这样的:
db.openDB(copyFile:false)
完成这些后,您就可以在不遇到任何问题的情况下运行任何SQL查询或执行数据库上的命令。
以下是使用上面示例中的Category
类的简单示例
Category
项目let category = Category()
category.name = "My New Category"
_ = category.save()
保存方法如果保存成功返回非零值。对于新记录,返回值是刚插入行的id
。您可以通过检查返回值来确定保存是否成功,因为0值表示由于某种原因保存失败。
id
获取Category
if let category = Category.rowBy(id:10) as? Category {
NSLog("Found category with ID = 10")
}
Category
表let array = Category.rows(filter:"id > 10") as! [Category]
Category
行(例如通过UITableView
显示类别)if let category = row(number:1) as? Category {
NSLog("Got first un-ordered category row")
}
Category
if let category = Category.rowBy(id:10) as? Category {
category.delete()
NSLog("Deleted category with ID = 10")
}
您可以在示例iOS和macOS项目中找到更多使用SQLTable
实现数据访问的示例。
SQLiteDB在DWYWPL - Do What You Will Public License下。您可以将代码用于个人或商业目的,但如果你愿意,请在你的应用程序中引用。