SwiftUI基础学习日记(十一)Sqlite数据操作

1,729 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

大家好,我是小黑,一个还没秃头的程序员~~~

人生苦短,要知道遗憾要比失败可怕的多

今天要介绍的是SwiftUI中用于操作数据的sqlite库,它和core 同样是用于数据存取的,但是我对sql数据比较亲切,所以先介绍如何使用sqlite库进行数据操作,效果可以参考我以往的文章: iOS-基于SwiftUI开发的简易备忘录,适合新人学习这是一个简易的备忘录app,适合新人学习,话不多说,开始正文:

SQLite.swift也是一个轻量级的、对swift友好的C语言包装器 API。

(一)添加依赖

先在swift package中添加sqlite的远程库

image.png

(二)model

准备一个实现了Identifiable协议的实体类,将ID设置成uuid,这样可以保证值唯一,如果实现了Identifiable却没有任何一个属性为唯一值,将会报错,这里忘了截图,大家可以自己试试,实体类代码如下:

struct NoteModel: Identifiable{
    var id = UUID()
    var title : String=""
    var content : String=""
    var createTimeStamp:String="0"
    var updateTimeStamp:String="0"
    
}

(三)Dao

准备一个对于这个实体所对应的数据表进行操作的工具类,充当Dao层作用

新增

 func insert(note:NoteModel) -> Bool{
            let insert = getNoteTable().insert(id_column<-note.id,title_column <- note.title,content_column<-note.content,create_time_stamp_column<-note.createTimeStamp,update_time_stamp_column<-note.updateTimeStamp)
            if let rowId = try? getDB().run(insert) {
                print("插入成功:\(rowId)条记录")
                getNotes(keyWord: searchContent, orderby: orderbyIndex)
                return true
            } else {
                print("插入失败")
                return false
            }
        }

删除

func delete( note:NoteModel) -> Bool{
        let deleteCmd = getNoteTable().filter(Expression<UUID>("id") == note.id)
        if let count = try? getDB().run(deleteCmd.delete()) {
            return count>0
        
        } else {
            return false
        }
    }

这里的filter类似于sql语句中的where查询

修改

func update(note:NoteModel) -> Bool {
        let updateCmd=getNoteTable().filter(id_column==note.id).update(id_column<-note.id,title_column <- note.title,content_column<-note.content,update_time_stamp_column<-Date().milliStamp)
        print(updateCmd)
        if let rowId = try? getDB().run(updateCmd) {
            print("更新成功:\(rowId)条记录")
            getNotes(keyWord: searchContent, orderby: orderbyIndex)
            return true
        } else {
            print("更新失败")
            return false
        }
        
    }

filter相当于where的作用,update中代表将值赋给相对应的列

查询

 // 查询
    func getNotes(keyWord:String,orderby:Int) -> Void{
        self.searchContent=keyWord
        self.orderbyIndex=orderby
        var orderby2:SQLite.Expressible
        switch orderby {
        case 0:
            orderby2=create_time_stamp_column.desc
        case 1:
            orderby2=update_time_stamp_column.desc
        default:
            orderby2=title_column.desc
        }
        let query = getNoteTable().order(orderby2).where(title_column.like("%\(keyWord)%")||content_column.like("%\(keyWord)%"))
            print(query)
            do {
                noteList.removeAll()
                let results = try getDB().prepare(query);
                
                for noteRow in results {
                    let note = NoteModel(id: noteRow[id_column], title: noteRow[title_column], content: noteRow[content_column], createTimeStamp: noteRow[create_time_stamp_column], updateTimeStamp: noteRow[update_time_stamp_column])
            
                    noteList.append(note)
                }
                print("查询成功")
                
            } catch {
                print("出错")
            }
        }

这里的查询用到了where函数,作为筛选,where函数中用到了like函数,相当于sql语句中的模糊查询,||或者&&相当于sql语句中的or 或者 and 查询,最后可以调用desc表示倒序查询

字段列

定义列的代码如下:

let id_column = Expression<UUID>("id")
let title_column=Expression<String>("title")
let content_column=Expression<String>("content")
let create_time_stamp_column=Expression<String>("createTimeStamp")
let update_time_stamp_column=Expression<String>("updateTimeStamp")

以上便是swift中关于sqlite的使用,今天的swiftUI学习分享就到这里,后面我会持续输出iOS开发笔记,感谢大家的阅读!共同努力!