数据库基础
class ViewController: UIViewController {
//MARK: - 属性
//1.数据库
lazy var db:FMDatabase = {
//a.创建数据库对象
//参数1:数据库文件路径(实际在开发过程中是沙盒下的一个路径)
//注:数据库文件的后缀是.sqlite或者.db
let tdb = FMDatabase.init(path: "/Users/qianfeng1/Desktop/项目位置/网络阶段/网络阶段第二周/第二周第4天/01-数据库基础/test1.sqlite")
//b.打开数据库
let ret = tdb.open()
if ret == true {
print("数据库打开成功")
}
else {
print("数据库打开失败")
}
return tdb
}()
override func viewDidLoad() {
super.viewDidLoad()
// self.createTable()
print(self.db)
// self.insertData()
// for item in 0...100 {
// let name = "name\(item)"
// let age = Int(arc4random()%15)+15
// let sex = arc4random()%2 == 0 ? "女" : "男"
// self.insertData(name, age: age, sex: sex)
// }
// self.updateData()
// self.deleteData()
self.getData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
//MARK: - 数据库操作
extension ViewController {
//MARK: - 数据查询
func getData() {
//1.创建数据查询的sql语句
let sqlStr = "SELECT * FROM t_Person"
//2.执行sql语句
//参数1:需要执行的查询语句
//参数2:sql语句中的占位符对应的值
//返回值:查询结果
let dataSet = self.db.executeQuery(sqlStr, withArgumentsInArray: [])
//3.获取结果集中的数据
//默认指向第一个结果到前一个位置,所以第一次调用next方法就是指向第一个结果,再调用就指向第二个结果
while dataSet.next() {
//获取每个结果的内容
//a.字符串和二进制通过object开头的方法去获取值
let name = dataSet.objectForColumnName("name")
//b.获取整型数据使用int开头的方法
let age = dataSet.intForColumn("age")
let sex = dataSet.objectForColumnName("sex")
//c.获取浮点型数据使用double开头的方法
// let score = dataSet.doubleForColumn("score")
print("\(name)\(age)\(sex)")
}
}
//MARK: - 删除数据
func deleteData() {
//1.创建删除语句
let sqlStr = "DELETE FROM t_Person WHERE age<21 and sex='男';"
let ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [])
if ret {
print("删除成功")
}else {
print("删除失败")
}
}
//MARK: - 更新数据
func updateData() {
let sqlStr = "UPDATE t_Person SET age = 18 WHERE age<18;"
let ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [])
if ret {
print("更新成功")
}
else {
print("更新失败")
}
}
//MARK: - 插入多条数据
func insertData(name:String,age:Int,sex:String) {
//1.创建 插入数据对应的sql语句
//'?'是sql语句中的占位符。sql语句中有不确定的值可以使用问号来代替,在执行sql语句的时候再给这个问号对应的值赋值
let sqlStr = "INSERT INTO t_Person(name,sex,age) VALUES(?,?,?);"
//2.执行sql语句
let ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [name,sex,age])
//3.判断执行结果
if ret {
print("数据插入成功")
}else {
print("数据插入失败")
}
}
//MARK: - 插入单条数据
func insertData() {
//1.创建 插入数据对应的sql语句
let sqlStr = "INSERT INTO t_Person(name,sex,age) VALUES('小明','男',22);"
//2.执行sql语句
let ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [])
//3.判断执行结果
if ret {
print("数据插入成功")
}else {
print("数据插入失败")
}
}
//MARK: 创建表
func createTable() {
//1.创建 创建表的sql语句
let sqlStr = "CREATE TABLE IF NOT EXISTS t_Person(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer DEFAULT 20,sex text DEFAULT '女');"
//2.执行sql语句
//参数1:需要执行的sql语句
//参数2:sql语句中的占位符对应的值
//参数3:SQL语句的执行结果
let ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [])
//3.判断执行结果
if ret {
print("创建表成功")
}
else {
print("创建表失败")
}
}
}