数据记录的创建、保存、查询和删除
在查看本章内容时,请首先查看关于设置数据类中的“User”数据类
创建并更新结果记录集
创建和更新数据的操作非常类似:如果主索引字段被设置为0或空,save方法会自动增加一个数据行(SQL INSERT操作),否则会进行数据更新(SQL UPDATE操作)。
创建一个新数据行:
let obj = User(connect)
obj.firstname = "Joe"
obj.lastname = "Smith"
try obj.save {
id in obj.id = id as! Int
}
注意新数据行中的属性.email在开始保存的时候被忽略了。此时,如果填写这个属性并在此保存:
email = "joe.smith@example.com" try obj.save()
因为 .id 属性已经被设置了,这时的数据保存则是一个 update 操作。
在主索引存在的情况下创建一个新数据记录
很多时候您希望手工设置主索引字段,在这种情况下,一旦改变了主索引字段的属性值,上面的保存工作方式就失效了。
因此,这种情况下请调用.create()方法。
该方法强制调用一个INSERT操作,并使用您主动设置的主索引值。
let obj = User(connect) obj.id = 10001 obj.firstname = "Mister" obj.lastname = "PotatoHead" obj.email = "potato@example.com" try obj.create()
错误捕获
.save方法调用时可以使用try语法,但是 ⚠️注意⚠️ 捕获到的结果是可以被忽略的。尽管如此,有针对性的错误处理总是一个好习惯。
前文提到的.save可以按照如下方法进行处理:
do {
try obj.save {id in obj.id = id as! Int }
} catch {
// 在控制台输出错误异常
print("发现错误 \(error)")
// 在此处进行错误处理。
}
查询数据
有三种方法可以用于查询一行或多行结果记录集:.get、.find和.select
Get 方法
.get方法能够用于通过主索引值直接提取具体的数据记录。
let obj = User(connect)
try obj.get(1)
print("用户姓名: \(obj.firstname) \(obj.lastname)")
用户的 id 标识也可以在 .get 操作之前设置。
let obj = User(connect)
obj.id = 2
try obj.get()
print("用户姓名:\(obj.firstname) \(obj.lastname)")
Find 方法
.find 方法会按照字段/值的方法精确匹配一个查询结果记录集。
let obj = User(connect)
try obj.find([("firstname", "Joe")])
print("找到记录: \(obj.id), \(obj.firstname), \(obj.lastname)")
内建的 SELECT 方法
更强大的查询功能是.select方法,用于获得更加复杂的查询操作。
select 方法能够接受几种不同的输入形式,最简单的一种是:
try obj.select(
whereclause: "firstname = $1",
params: ["Joe"],
orderby: ["id"]
)
The .select 方式的好处是能够防止绑定到项目的参数被黑客进行SQL注入。尽管所有的方法都是能够达到防范目的,但是只有少数核心方法需要您了解参数绑定是如何操作的。
前面的例子中,参数$1用于告诉计算机该参数将会被替换为参数数组 .params 的第一个元素。替换参数将保护数据类型不被滥用。
而.select方法允许更多精准的检索,比如 LIKE 和其他逻辑比较运算符。这方面您需要事先了解以下 SQL 的基础知识。
.select 方法还包括一些选项:
columns: [String], cursor: StORMCursor
columns列数组允许为查询结果集指定字段名。cursor是一个StORMCursor游标对象,用于确定从返回的结果记录集的首记录开始的数据行号,经常用于结果分页输出。
删除数据行。
删除数据的操作和.get方法很相似:直接确定待删除的主索引号,或者根据当前数据行号进行删除。
let obj = User(connect) try obj.delete(1)
let obj = User(connect) obj.id = 1 try obj.delete()