数据持久化之SQLite数据库(SQLite.swift使用)
一、 简介
SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。SQLite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库
一个数据库中的表就算是一个文件,一般是将这个文件放在沙盒Document目录下,文件后缀名一般为db(database)
SQLite.swift:他就是为了swift专业打造的一SQLite为基础的swift封装的第三方库,Github地址:https://github.com/stephencelis/SQLite.swift
二、 SQlite.swift的使用
首先还是要导入SQlite.swift库(导入方法自行百度),导入响应的二进制文件,还要导入数据库SQlite[重点],设置完成后的界面应该有如下图中红线部分
使用Sqlite.swift基本功能
//: Playground - noun: a place where people can play
//使用SQLite之前记得要添加在工程属性Build Phases 选项,增加SQLite iOS到Target Dependencies中
//用于介绍SQlite.swift的基本使用地址https://github.com/stephencelis/SQLite.swift
//详细使用地址:https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#sqliteswift-documentation
import SQLite
//**链接数据库
let db = try Connection("path/to/db.sqlite3")//与数据库连接(重点)
//**定义表属性
let users = Table("users") //创建数据表名字
let id = Expression("id") //定义表属性
let name = Expression("name")
let email = Expression("email")
//**建表
try db.run(users.create { t in //创建表只需要产生一次,多次运行会报错
t.column(id, primaryKey: true)
t.column(name)
t.column(email, unique: true)
})
// CREATE TABLE "users" (
// "id" INTEGER PRIMARY KEY NOT NULL,
// "name" TEXT,
// "email" TEXT NOT NULL UNIQUE
// )
//*插入
let insert = users.insert(name <- "Alice", email <- "[email protected]") //插入的信息
let rowid = try db.run(insert)//返回插入的id //执行插入
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
for user in try db.prepare(users) { //采用循环式使用(.prepare:表示准备执行某表某操作)//返回表行
print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
// id: 1, name: Optional("Alice"), email: [email protected]
}
//*选择
// SELECT * FROM "users"
let alice = users.filter(id == rowid) //[filter:过滤] //查询(返回一个表不是行,无法直接输出)可以像操作数据表一样操作它(并且会同步到初始表)如果失败了,表的数量为0呗(db.scalar(alice.count) //0)
//*更新
try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))//执行更新
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') //这里还是部分更新
// WHERE ("id" = 1)
//*删除
try db.run(alice.delete()) //执行删除
// DELETE FROM "users" WHERE ("id" = 1)
db.scalar(users.count) // 0 //【scalar:数量】 //统计数据行数
// SELECT count(*) FROM "users"
建议,实际使用,将部分代码(如建表)分开到另外的地方,将一些其他的数据变量化
/// SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C API.
//可以直接执行语句????
let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["[email protected]", "[email protected]"] {
try stmt.run(email)
}
db.totalChanges // 3
db.changes // 1
db.lastInsertRowid // 3
for row in try db.prepare("SELECT id, email FROM users") {
print("id: \(row[0]), email: \(row[1])")//用下标代替列
// id: Optional(2), email: Optional("[email protected]")
// id: Optional(3), email: Optional("[email protected]")
}
db.scalar("SELECT count(*) FROM users") // 2
提示:Sqlite数据库可以使用可视化工具MesaSQlite软件(例如:SQLite Manager)打开
SQlite.swift的使用Github介绍(详细):https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md- sqliteswift-documentation
扩展链接:SQlite常用语句
三、在OC开发语言下使用FMBD
1、什么是FMDB
FMDB是基于OC语言对SQlite数据库使用的封装,具有对象化概念(注意这里的对象化概念不是说可以直接存储对象,是指OC语言的基本对象【NSInteger(integer)、浮点型(real)、NSString (text) 、 对象或其他(blol)】,实际数据库存储的类型只有小括号内的四中基本的。对于图片等其他类型的可以转化为二进制存储在数据库中。
数据库的创建以及增删查该使用介绍:宏创学院->数据本地化
补充学习,如何传不定参数到sql语句中:http://www.jianshu.com/p/2ea0d60b15f0
删除数据表:
if (![database executeUpdate:@"delete from contactLists"]) {// 【learn:以下语句无法删除】drop contactList if exsists
插入(注意插入语法和方式,不要两种混搭使用呀!):
第一种:先写好sql语句(比较建议,调试可以查看插如语句数据有没有错误,name是已经定义的NSString变量)
NSString *insertSql = [NSString stringWithFormat:@"insert into contactLists(userName,sign,age) values('%@','%@','%d')",name,@"签名",18];//[注意:这里必须指定值类型需,不可以在values中使用?会出错]
第二种:更新的时候加入,这个时候的值类型可以使用?代替,但是数字前的加@。
//在executeUpdate后面直接加sql语法时,使用?来表示OC中的对象,integer对应NSNumber,text对应NSString,blob对应NSData,数据内部转换FMDB已经完成,只要sql语法正确就没有问题
if (![database executeUpdate:@"insert into person (id, name, sex, telephone) values (?, ?, ?, ?)", @4, @"gary", @"male", @"99996666"])
对于查找:
/*
DQL查询数据
SELECT -- 查询
name, age -- 查询的字段
FROM -- 从哪张表中查询
contactLists -- 查询的表名
*/
-- 查询指定字段
SELECT name, age FROM contacLists;
-- 查询所有字段
SELECT * FROM contactLLists;
-- 查询 age < 22 的记录的name, age字段
SELECT name, age FROM contactLists WHERE age < 22;
-- 查询 age < 22 的所有字段
SELECT * FROM contactLists WHERE age < 22;
-- 查询记录总数
SELECT COUNT(*) FROM contactLists;
-- 查询 age < 22 的记录总数
SELECT COUNT(*) FROM contactLists WHERE age < 22;
-- 查询最大的 age
SELECT MAX(age) FROM contactLists;
-- 查询最小的 age
SELECT MIN(age) FROM contactLists;
-- 查询所有记录的所有字段,根据 age 升序排序
SELECT * FROM contactLists ORDER BY age;
-- 查询所有记录的所有字段, 根据 age 降序排序
SELECT * FROM contactLists ORDER BY age DESC;
-- 使用多个字段排序,先按age降序排序,当age相同再根据height降序排序
SELECT * FROM contactLists ORDER BY age DESC,height DESC;
-- 返回指定的记录
-- LIMIT常用于分页
-- 0 表示跳过的3条
-- 2 表示获取2条
SELECT * FROM contactLists LIMIT 3, 2;
-- 取出年龄最大的3条记录
SELECT * FROM contactLists ORDER BY age DESC LIMIT 3;
-- 查询是给字段取别名
SELECT name AS contactLists, age AS age1, height AS height1 FROM Person;
疑问:
1.怎么设置数据表字段为不能为空,外键等?