SwiftySQLLite 0.1.10

SwiftySQLLite 0.1.10

测试已测试
语言语言 SwiftSwift
许可 MIT
发布上次发布2017年9月
SwiftSwift 版本3.0
SPM支持 SPM

Chelemen Razvan 维护。



  • 作者:
  • Chelemen Razvan

SQLiteDB

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 子类推断表的架构,并在必要时自动为您创建必要的表。

例如,假设您有一个只有一个idname两列的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实现数据访问的示例。

有疑问吗?

  • 常见问题解答: ![FAQ](https://github.com/FahimF/SQLiteDB/wiki/FAQs)
  • Get help on Codementor
  • 网站: ![http://rooksoft.sg/](http://rooksoft.sg/)
  • 推特: ![http://twitter.com/FahimFarook](http://twitter.com/FahimFarook)

SQLiteDB在DWYWPL - Do What You Will Public License下。您可以将代码用于个人或商业目的,但如果你愿意,请在你的应用程序中引用。