SwiftUI研究ノート[Sqlite]

序文

モバイル端末の開発文件储存では、データをローカリゼーションで保存できます[つまり、ローカルファイルへNSUserDefaults書き込みの本質は、データをkey = valueの形式でファイルに保存することですplist]。もちろん、大量のデータディクショナリストレージは依然として必要です。強力sqliteです。

1つは、SQLiteDB統合です。

1.フレームファイルをダウンロードします

  • SQLiteDBする公式サイトの重要な.swiftフレームワークのドキュメントを取得するには、ファイルの解凍をダウンロードし、[ CloudDB.swiftSQLTable.swiftSQLiteBase.swiftSQLiteDB.swift]。

2.次にアイテムにドラッグします

ここで、swiftファイルはグローバルにアクセス可能である必要があり、ヘッダーファイルを導入する必要はありませんが、無効である可能性があるため、グループ化せずにプロジェクトの直下にスローすることに注意してください。

3.Xcodeはdbファイルを追加します

ではBuild Phases、次の追加.dbファイル、.dbファイルがあなた自身や会社の新しいデータベース.dbファイル[必要がSQLiteBase.swiftを変更することに注意することができDB_NAME、公式のパッケージの内側をダウンロードするのが面倒もちろん、.DBファイル名をインポートします]、data.db追加することも可能です。独自のライブラリの操作方法についても後で説明します。

4.新しい華僑受領書類を作成する

プロジェクト名を右クリックして新しいファイルを作成します->Cocoa Touch Classファイルを選択して[次へ]をクリックします

華僑クラスの名前を入力し、ここに名前を付けて[ brid_head]、[サブクラス]を選択し、[UIView言語]を選択してObjective-C[次へ]をクリックします。

次のようにswiftUIStudyを選択し、[作成]をクリックします

一部の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 - GeneralObjective-Cブリッジヘッダーの後ろの空白スペースをダブルクリックして、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.sharedSQLiteDBをインスタンス化.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)
    }
}
  • 実行する前に、実行する前に、実行中の開始インターフェイスを次のように変更することを忘れないでください。

次に、[開く]をクリックすると、結果が1であることがわかります。作成は成功しました。

4.テーブルが正常に作成されたかどうか[验证]

コードでは、シミュレーターのパスを出力しました。テーブルが正常に作成されたかどうかを確認するには、クリックする必要があります。私たちは事実について話します。次のコードを使用して、シミュレーターパスを出力できます。

func homePath() -> NSString {
        
        return NSHomeDirectory() as NSString;
        
}

ターミナルを開き、次のようにオープンパスを入力します。

  • [Enter]をクリックすると、図1で強調表示されたフォルダーとともに一連のフォルダーが表示され、[Documents]-> [data.db]をクリックします。

  • [ドキュメント]または[ライブラリ]をクリックします-> 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))

            

3つ、SQLiteDB-、SQLiteDB.swiftの操作任意.db文件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))

  • クエリボタンをクリックします。次のように新しいコントロールに従います。

次に、独自のデータベースの運用に進みます。
....下午继续

おすすめ

転載: blog.csdn.net/m0_37667770/article/details/110849971