• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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))
    
    
    • 點擊查詢按鈕:跟新控件如下

    接下來我們進行操作自己數據庫。
    ....下午繼續

    版權聲明:本文為m0_37667770原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/m0_37667770/article/details/110849971

    智能推薦

    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教程與源碼...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡