SwiftUI學習筆記[Sqlite]
標簽: IOS專欄 Swift數據庫 Swift操作Sqlite IOS數據庫操作
前言
移動端開發對于數據本地化的儲存可有
文件儲存
【即寫入到本地文件中NSUserDefaults
的本質就是將數據按照key=value形式儲存在plist
文件】,當然大量的數據字典儲存還是得用強大的sqlite
。
一,SQLiteDB-集成
1.下載框架文件
- SQLiteDB官網 中下載文件解壓拿到關鍵的.swift框架文件【
CloudDB.swift
,SQLTable.swift
,SQLiteBase.swift
,SQLiteDB.swift
】。
2.然后拖動到項目下
這里需要注意,swift文件應該來說全局可訪問,不需要引入頭文件,但是可能失效,所以我直接扔到項目下面沒有成組。
3.Xcode添加db文件
在
Build Phases
下面添加.db
文件,這里的.db
文件可以是自己新建的或者公司的數據庫.db文件【需要注意的是需要去SQLiteBase.swift里面修改DB_NAME
為導入的.db文件名】,當然太懶了在官方下載包里面添加data.db也可以。至于如何操作自己的庫后面也會寫。
4.新建僑接文件
在項目名稱右鍵新建文件->選擇
Cocoa Touch Class
文件點擊Next
輸入僑接類的名稱隨便起名即可我這里【
brid_head
】,Subclass of選擇UIView
,Language選擇Objective-C
點擊Next。
如下選擇swiftUIStudy點擊Create
有些Xcode可能會自動提示生成僑接文件。可以點擊ok自動生成
項目名_Bridging-Header.h
最后刪除brid_head.h以及brid_head.m文件,但是像我的Xcode有時候能自動生成僑接文件,有時候不會生成橋接文件,這時候我們只需要將下面語句復制到brid_head.h
文件或項目名_Bridging-Header.h
里面。
#import "sqlite3.h"
#import <time.h>
然后我們去點擊項目如下圖中1—>
Build Setting
----->圖中2 combined
----->Swift Compiler - General
雙擊Objective-C Bridging Header 后面空白出拖動或者粘貼brid_head.h的路徑即可。
二,SQLiteDB-操作
1.新建UI頁面
新建操作數據庫的專有頁面
2.SQLiteDB源碼閱讀
///1.shared源碼這里初始化創建SQLiteDB實例static修飾作為單利提供給外界訪問。
/// Singleton instance for access to the SQLiteDB class
static let shared = SQLiteDB()
//2.dbPath作為本地數據庫路徑。根據代碼我們可以看出如果dbPath為null那么默認會獲取項目下的DB_NAME=data.db
//作為空數據庫容器,inMemory是使用內存數據庫還是磁盤數據庫。我們以db文件的形式就是默認false即磁盤數據庫
override func open(dbPath: String = "", copyFile: Bool = true, inMemory: Bool = false) -> Bool {
NSLog("DB Open called with path: \(dbPath)")
var path = ""
if !inMemory {
if dbPath.isEmpty {
guard let url = Bundle.main.resourceURL else { return false }
path = url.appendingPathComponent(DB_NAME).path
} else {
path = URL(fileURLWithPath: dbPath).path
}
}
NSLog("Calling Super Open with path: \(path)")
return super.open(dbPath: path, copyFile: copyFile, inMemory: inMemory)
}
.
.
.
.
封裝了很多方法可以自己看哦
3.SQLiteDB初步使用
通過
SQLiteDB.shared
實例化SQLiteDB,.open()
打開數據庫,通過.execute(sql:"數據庫操作語句")
進行操作即可。如下代碼:
import SwiftUI
struct Swift_Sqlite_UIView: View {
//1.獲取數據庫實例
var db:SQLiteDB=SQLiteDB.shared
var body: some View {
VStack(){
Text("SQLiteDB操作").modifier(TitleStyle())
//1.數據庫操作打開DB鏈接
HStack{
Text("open").onTapGesture {
//2.這里進行打開數據庫
_=self.db.open()
//3.執行創建表操作操作
_=self.db.execute(sql: "create table if not exists users(uid integer primary key,uname varchar(20),description varchar(20))")
print("path=\(homePath())")
}.modifier(Title())
}.modifier(StackStyle(alignment:Alignment.topLeading))
}.modifier(StackStyle(alignment:Alignment.top))
}
}
struct Swift_Sqlite_UIView_Previews: PreviewProvider {
static var previews: some View {
Swift_Sqlite_UIView()
}
}
//modifier
struct TitleStyle: ViewModifier {
func body(content: Content) -> some View {
content.padding(EdgeInsets(top: 66,leading: 1,bottom: 1,trailing: 1)).font(/*@START_MENU_TOKEN@*/.title/*@END_MENU_TOKEN@*/)
}
}
struct Title: ViewModifier {
func body(content: Content) -> some View {
content.padding(EdgeInsets(top: 16,leading: 11,bottom: 1,trailing: 1)).font(.title)
}
}
struct StackStyle: ViewModifier{
var alignment=Alignment.top
var screenBounds:CGRect = UIScreen.main.bounds
func body(content: Content) -> some View {
content.frame(width:screenBounds.width, height: screenBounds.height, alignment:alignment)
}
}
- 運行之前記得更改運行啟動界面如下再運行:
接著點擊open,我們看到返回結果是1。說明創建成功。
4.建表是否成功[驗證]
代碼中我們打印了模擬器的路徑,我們需要點進去看看當前是否創建表成功。我們那事實說話。一下代碼我們能打印模擬器路徑:
func homePath() -> NSString {
return NSHomeDirectory() as NSString;
}
打開終端輸入open 路徑如下:
-
點擊回車,出現一堆文件夾有一個高亮的文件夾圖中1,點擊Documents->出現data.db
-
點擊Documents或者Library->出現data.db 我們利用Navicat Premium 等工具打開數據庫查看表
-
查看data.db表如下
驗證成功
:
5.SQLiteDB-增查改刪
—存粹的sql語句拼接
SQLiteDB之所以好用其原因就是直白的使用sql語句即可。
【1】增
:
Text("insert").onTapGesture {
let uname = "王飛"
let description = "路很長"
//插入數據庫,這里用到了esc字符編碼函數,其實是調用bridge.m實現的
let sql = "insert into persons(uname,description) values('\(uname)','\(description)')"
print("sql: \(sql)")
//通過封裝的方法執行sql
let result = db.execute(sql: sql)
print(result)
}.modifier(Title())
- 運行看效果同樣方式拿到路徑終端打開,數據表查看
插入成功!
【2】查
:
//查詢數據
Text("select").onTapGesture {
let uname = "王飛"
//插入數據庫,這里用到了esc字符編碼函數,其實是調用bridge.m實現的
let sql = "select uname from persons where uname='\(uname)'"
print("sql: \(sql)")
//通過封裝的方法執行sql
let result = db.query(sql: sql)
//獲取最后一行數據顯示
let name = result[0]["uname"] as? String
print("數據庫數據來了=\(String(describing: name))")
}.modifier(Title())
打印結果ok
【3】改
:
//跟新數據
Text("updata").onTapGesture {
let uname = "大飛飛"
//插入數據庫,這里用到了esc字符編碼函數,其實是調用bridge.m實現的
let sql = "update persons set uname = '\(uname)'"
print("sql: \(sql)")
//通過封裝的方法執行sql
_ = db.execute(sql: sql)
//查詢
let selectSql = "select uname from persons"
print("sql: \(selectSql)")
//通過封裝的方法執行sql
let results = db.query(sql: selectSql)
let name = results[0]["uname"] as? String
print("修改之后的數據=\(String(describing: name))")
}.modifier(Title())
【4】刪
:
記住每次運行需要重新打開,插入,然后刪除。不然報錯
超出索引異常
。
//刪除數據
HStack{
Text("delete").onTapGesture {
let uname = "大飛飛"
//刪除滿足條件數據
let sql = "delete from persons where uname = '\(uname)'"
print("sql: \(sql)")
//通過封裝的方法執行sql
_ = db.execute(sql: sql)
//查詢
let selectSql = "select *from persons"
print("sql: \(selectSql)")
//通過封裝的方法執行sql
let results = db.query(sql: selectSql)
let name = results.count
print("修改之后的數據個數=\(String(name))個")
}.modifier(Title())
}.modifier(StackStyle(alignment:Alignment.topLeading,height: 66))
三,SQLiteDB-操作任意.db文件
,在SQLiteDB.swift進行修改DB_NAME=“bhnes.db”
操作如下,新增bhnes.db,
-
表結構如下:
-
代碼如下
VStack{
Text("操作其他.db文件").onTapGesture {
db.open()
let uname = "大飛飛"
//刪除滿足條件數據
let sql = "delete from persons where uname = '\(uname)'"
print("sql: \(sql)")
//通過封裝的方法執行sql
_ = db.execute(sql: sql)
//查詢
let selectSql = "select *from persons"
print("sql: \(selectSql)")
//通過封裝的方法執行sql
let results = db.query(sql: selectSql)
let name = results.count
print("修改之后的數據個數=\(String(name))個")
}.offset(x:80.0, y:10).modifier(TitleStyle()).foregroundColor(.red)
Text("查詢").onTapGesture {
_=self.db.open()
//插入數據庫,這里用到了esc字符編碼函數,其實是調用bridge.m實現的
let sql = "select name from EquipType where code='Z'"
print("sql: \(sql)")
//通過封裝的方法執行sql
let result = db.query(sql: sql)
//獲取最后一行數據顯示
let name = result[0]["name"] as? String
print("數據庫數據來了=\(String(describing: name))")
DispatchQueue.main.async {
if (!(name!.isEmpty)){
self.queryResult = name! as String
self.flag=true
}
}
}.modifier(Title()).offset(x: -60.0, y: 10.0)
Text(self.flag ? queryResult : "查詢結果").modifier(Title())
}.modifier(StackStyle(alignment:Alignment.topLeading,height: 266))
- 點擊查詢按鈕:跟新控件如下
接下來我們進行操作自己數據庫。
....下午繼續
智能推薦
3、SQLite學習筆記--SQLite的命令與語法
一、.help 查看命令使用提示 1、提示如下 2、提示詳解 命令 描述 .backup ?DB? FILE 備份 DB 數據庫(默認是 "main")到 FILE 文件。 .bail ON|OFF 發生錯誤后停止。默認為 OFF。 .databases 列出數據庫的名稱及其所依附的文件。 .dump ?TABLE? 以 SQL 文本格式轉儲數據庫。如果指定了 TABLE 表,...
安卓學習筆記——SQLite學習
SQLite簡介: 開源關系型數據庫,運算速度快,占用資源少,在內存上只有幾百k的存儲空間,非常適用于移動端。 SQLite特點 占用空間小 運行高效 可移植性好 支持標準SQL語法 支持ACID事務 零配置:無需安裝和網絡管理配置 支持多種開發語言,C, PHP, Perl, Java, C#,Python SQLite沒有服務器進程,它通過文件保存數據,該文件是跨平臺的,可以放在其他平臺中使用...
android學習筆記----SQLite數據庫
目錄 用SQLite語句執行: 利用SQLiteDatabase中自帶的增刪改查操作: SQLite數據庫的事務介紹: 目錄一二的增刪改查源碼地址:https://github.com/liuchenyang0515/CreateDB3 目錄三事務介紹的源碼地址:https://github.com/liuchenyang0515/BankTransfer ...
sqlite學習筆記(1)環境搭建
一、 命令運行平臺 學習一樣新的先要把環境平臺搭建起來,然后自己多實踐才能領悟的更快一點。初學時可以參考《sqlite3權威指南》。 首先去官網下載sqlite-tools-win32-x86-3190300.zip和sqlite-dll-win64-x64-3200100.zip(注意我的是64位的,...
SQLite3 學習筆記總結
文章目錄 總結 命令 終端命令 sqlite 命令 子句 DISTINCT 表達式 WHERE AND/OR GROUP BY/HAVING ORDER BY OFFSET/LIMIT 運算符 算術運算符:`+`、`-`、`*`、`/`、`%` 比較運算符 邏輯運算符 位運算符:`&`、`|`、`~`、`<<`、`>>` DDL 數據類型 數據庫操作 表操作 DML...
猜你喜歡
SwiftUI Sqlite如何存儲復雜對象(2020)
SwiftUI Sqlite如何存儲復雜對象 如何你有大量圖片或者復雜文本需要存儲,sqlite 的Blob類型將是你最佳的選擇 代碼 數據截圖 image.png 定義了NoteObject父類 NoteObject的子類 來源 https://github.com/indaos/DaoNotes 更多SwiftUI教程和代碼關注專欄 請關注我的專欄 SwiftUI教程與源碼...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...