Notas de estudio de SwiftUI [Sqlite]

Prefacio

El desarrollo de terminales móviles puede almacenar datos en la localización 文件储存[es decir, NSUserDefaultsla esencia de escribir en un archivo local es almacenar datos en un archivo en forma de clave = valor plist]. Por supuesto, una gran cantidad de almacenamiento de diccionario de datos todavía tiene que ser poderoso sqlite.

Uno, integración SQLiteDB

1. Descarga el archivo del marco

  • SQLiteDB sitio web oficial para descargar el archivo de descompresión para obtener documento marco .swift crítico [ CloudDB.swift, SQLTable.swift, SQLiteBase.swift, SQLiteDB.swift].

2. Luego, arrastre hasta el elemento.

Cabe señalar aquí que el archivo rápido debe ser accesible globalmente, y no es necesario introducir el archivo de encabezado, pero puede no ser válido, por lo que simplemente lo arrojo directamente debajo del proyecto sin agruparlo.

3. Xcode agregar archivo db

A Build Phasescontinuación, agregue .dbarchivos, donde los .dbarchivos pueden ser suyos o el archivo .db de la base de datos nueva de la compañía [Tenga en cuenta que la necesidad de modificar SQLiteBase.swift, que DB_NAMEes el nombre del archivo .db importado], por supuesto, es demasiado perezoso para descargar el paquete oficial dentro También es posible agregar data.db. Más adelante también se escribirá cómo operar su propia biblioteca.

4. Cree nuevos documentos de recepción chinos en el extranjero

Haga clic derecho en el nombre del proyecto para crear un nuevo archivo -> seleccione el Cocoa Touch Classarchivo y haga clic en Siguiente

Ingrese el nombre de la clase de chino extranjero y simplemente asígnele el nombre aquí [ brid_head], seleccione Subclase de, seleccione UIViewIdioma y Objective-Chaga clic en Siguiente.

Seleccione swiftUIStudy de la siguiente manera y haga clic en Crear

Algunos Xcode pueden solicitar automáticamente que se generen archivos de recepción chinos en el extranjero. Puede hacer clic en Aceptar para generar automáticamente y 项目名_Bridging-Header.hfinalmente eliminar los archivos brid_head.hy brid_head.m, pero como mi Xcode a veces puede generar automáticamente el archivo de conexión en el extranjero, a veces no generará el archivo puente, entonces solo necesitamos copiar lo siguiente declaración al brid_head.harchivo o en el 项目名_Bridging-Header.hinterior.

#import "sqlite3.h"
#import <time.h>

Luego vamos a hacer clic en el elemento como se muestra en la figura 1—> Build Setting-----> 图中2 combined-----> Swift Compiler - GeneralHaga doble clic en el espacio en blanco detrás de Objective-C Bridging Header para arrastrar o pegar la ruta de brid_head.h .

En segundo lugar, operación SQLiteDB

1. Crea una nueva página de IU

Cree una página dedicada para operar la base de datos

2.Lectura del código fuente de 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. Uso inicial de SQLiteDB

Por SQLiteDB.sharedinstanciar SQLiteDB, .open()la apertura de la base de datos y .execute(sql:"数据库操作语句")realizar operaciones. El siguiente código:

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)
    }
}
  • Antes de ejecutar, recuerde cambiar la interfaz de inicio en ejecución de la siguiente manera antes de ejecutar:

Luego haga clic en abrir, y vemos que el resultado devuelto es 1. La creación tiene éxito.

4. Si la tabla se construyó correctamente[验证]

En el código, hemos impreso la ruta del simulador, necesitamos hacer clic para ver si la tabla se creó correctamente. Hablamos de los hechos. Con el siguiente código podemos imprimir la ruta del simulador:

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

Abra la terminal e ingrese a la ruta abierta de la siguiente manera:

  • Haga clic en Entrar, aparecen un montón de carpetas con una carpeta resaltada en la Figura 1, haga clic en Documentos-> aparece data.db

  • Haga clic en Documentos o Biblioteca-> aparece data.db, usamos Navicat Premium y otras herramientas para abrir la base de datos y ver la tabla

  • Vea la tabla data.db de la siguiente manera 验证成功:

5.SQLiteDB- 增查改删-存粹的sql语句拼接

La razón por la que SQLiteDB es fácil de usar es usar sentencias SQL de manera directa.

【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())
  • Ejecute para ver el efecto de la misma manera, haga que se abra la terminal de ruta y vea la tabla de datos插入成功!

【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】:

Recuerde que cada ejecución debe volver a abrirse, insertarse y luego eliminarse. De lo contrario, informe un error 超出索引异常.

 //删除数据
  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))

            

Tres, SQLiteDB- 操作任意.db文件, modificar DB_NAME = "bhnes.db" en SQLiteDB.swift

La operación es la siguiente, agregue bhnes.db,

  • La estructura de la tabla es la siguiente:

  • el código se muestra a continuación

 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))

  • Haga clic en el botón de consulta: siga el nuevo control de la siguiente manera

A continuación, procedemos a operar nuestra propia base de datos.
....下午继续

Supongo que te gusta

Origin blog.csdn.net/m0_37667770/article/details/110849971
Recomendado
Clasificación