当前位置: 首页 > 编程日记 > 正文

SQLite.swift的简单使用

使用cocoapod 来进行引入

pod ‘SQLite.swift’

//
// SQLiteTool.swift
// CreateLectureForSwift
//
// Created by coder on 2019/6/25.
// Copyright © 2019 AlexanderYeah. All rights reserved.
//

import Foundation
import SQLite

// id
let id = Expression(“id”)
// 名字
let name = Expression<String?>(“name”)
// 价格
let price = Expression(“price”)
// 价格
let imgUrl = Expression(“imgUrl”)

// 价格
let p_id = Expression(“p_id”)

// 数量
let quantity = Expression(“quantity”)

class SQLiteTool: NSObject {

// 单例方法
static let tool:SQLiteTool = {let tool  = SQLiteTool();return tool;
}();// 数据库
private var db : Connection?;
// 表
private var tb :Table?;

}

extension SQLiteTool{

// 打开数据库返回一个连接
func openDB() -> Connection {if  db == nil {let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!;print(path as Any);db = try! Connection("\(path)/shopCart.sqlite3");            db?.busyTimeout = 5;}return db!;
}// MAKR:- 创建表
func createTb() ->Table {if self.tb == nil {// 创建表self.tb = Table("cart1");// 插入内容try! openDB().run(// temporary 是否为临时表// ifNotExists 是否在不存在的时候进行创建// withoutRowid 是否自动创建自增的idself.tb!.create(temporary: false, ifNotExists: true, withoutRowid: false, block: { (t) int.column(id,primaryKey: true);t.column(name);t.column(price);t.column(imgUrl);t.column(quantity);t.column(p_id);}))}return self.tb!;}// MAKR:- 插入操作func insert(model:ProductModel)  {// 插入的新的一条的时候 判断当前的条是否存在表中 如果存在的话 直接修改其数量即可let query =  self.tb!.filter(p_id == model.Id!);let result = try! self.db!.prepare(query);let array = Array(result);if array.count == 0 {print("插入前查询结果为0,执行插入操作");let insert = self.tb?.insert(p_id <- model.Id!,name <- model.Name,price <- model.SalePrice!,quantity <- 1,imgUrl <- model.CoverImage!)// 执行插入操作 插入成功会返回对应的ROWIDlet rowID = try? self.db?.run(insert!);if (rowID != nil) {print("插入成功")}else{print("插入失败")}}else{print("不为0 做更新操作");let row = array.first;let targetQuantity = try? row!.get(quantity);if try! (self.db?.run(query.update(quantity <- (targetQuantity! + 1))))! > 0{print("修改数据成功 count == 1");}else{print("修改数据失败");}}}// MARK:- 删除操作
func delete(rowId:Int64){// 删除单行的数据let del = self.tb?.filter(id == rowId);do {if try self.db!.run(del!.delete()) > 0 {print("删除成功")}else{print("删除失败")}} catch  {print("删除失败")}
}
// MARK:- 查询全部数据
func findAll() ->[Row]{// 查询全部的数据let result = try! db?.prepare(self.tb!);return Array(result!);}// MAKR: - 获取购物车商品的数量
func getCartTotalCount() -> Int64{let result = try! db?.prepare(self.tb!);let array = Array(result!);var totalCount:Int64 = 0;for row in array {totalCount = (try! row.get(quantity)) + totalCount;}return totalCount;
}

}

相关文章:

Cypress USB开发文档列表(积累中)

CyUSB.chm(pdf) \Cypress\Cypress Suite USB 3.4.7\Driver Cypress CyUSB.sys Programmers Reference 内容: CyUsb.sys、CyUsb.inf 驱动程序介绍&#xff0c;如何绑定设备到驱动程序&#xff0c;以IOCTL Interface、CYIOCTL.Hd的解释为主要内容的编程指导&#xff0c;主…

对象冒充_使用您的精神探照灯进行冒充冒名顶替综合症

对象冒充by Jaime J. Rios由Jaime J. Rios “Stop that imposter! Seize them!”“停止冒名顶替者&#xff01; 抓住他们&#xff01;” I first spotted my imposter two years ago. It happened when I began learning how to code.两年前&#xff0c;我第一次发现了冒名顶…

grep 函数

linux grep命令1.作用Linux系统中grep命令是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹 配的行打印出来。grep全称是Global Regular Expression Print&#xff0c;表示全局正则表达式版本&#xff0c;它的使用权限是所有用户。 2.格式gr…

iOS weak 自动置为nil的实现

1 weak 自动置为nil的实现 runtime 维护了一个Weak表&#xff0c;weak_table_t 用于存储指向某一个对象的所有Weak指针。Weak表其实是一个哈希表&#xff0c; key是所指对象的地址&#xff0c;value是weak指针的地址的数组。 在对象回收的时候&#xff0c;就会在weak表中进…

iOS 缓存策略

Github https://github.com/gaosboy/kache https://github.com/swtlovewtt/WTRequestCenter https://github.com/hans007/CacheFile Image https://github.com/youger/UIImageView-ASIImageCache转载于:https://www.cnblogs.com/hl666/p/3931182.html

数据结构的简要介绍:图形如何工作

by Michael Olorunnisola通过Michael Olorunnisola 数据结构的简要介绍&#xff1a;图形如何工作 (A Gentle Introduction to Data Structures: How Graphs Work) So who wants to work at Google, Facebook, or maybe LinkedIn? Beyond their grueling interview process, o…

Catel(翻译)-为什么选择Catel

1. 介绍 这篇文章主要是为了说明&#xff0c;我们为什么要使用Catel框架作为开发WPF&#xff0c;Silverlight,和Windows phone7应用程序的开发框架。 2. 通用功能 2.1. 这是你的选择 针对需对开发者&#xff0c;再使用架构的时候是希望有很大的自由度的&#xff0c;但是大部…

iOS 三种类型的Block

Block 的copy 操作 Block 其实来讲有三种类型 全局块 NSConcreteGlobalBlock 栈块 NSConcreteStackBlock 堆块 NSConcreteMallocBlock 全局块存储在全局内存中&#xff0c;相当于单例 栈块存于栈内存中&#xff0c;超出其作用域则马上进行销毁 堆块存在于堆内存中&#x…

2.4G高频PCB天线设计

2.4G高频PCB天线设计转载于:https://www.cnblogs.com/LittleTiger/p/6215262.html

如何一起破解图形化Python调试器

15分钟内从零调试 (Zero-to-Debugging in 15 mins) You don’t realize the value of a debugger until you’re stuck working on a hard-to-visualize problem. But once you fire up a development environment with decent debugging capabilities, you’ll never look bac…

python 之路,Day11 (下)- sqlalchemy ORM

python 之路&#xff0c;Day11 - sqlalchemy ORM 本节内容 ORM介绍sqlalchemy安装sqlalchemy基本使用多外键关联多对多关系表结构设计作业1. ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序&#xff0c;简单来说我们类似python这种面向对象的程序来说一切…

iOS事件响应链

1 如下 NSObject 显然是基类&#xff0c;都是继承与UIResponder. 可以看出UIApplication&#xff0c;UIView&#xff0c;UIViewController都是继承自UIResponder类&#xff0c;可以响应和处理事件 我们都是通过UIResonder 来查找控件的父视图控件。’ 发生触摸事件之后&…

论5级流水32bit risc cpu设计

前段时间用verilog写了一个32bit的risc cpu,五级流水&#xff0c;下板调试已经完全可用&#xff0c;准备后期加入浮点运算器&#xff0c;因为最近事情超级多&#xff0c;因此暂时先把RTL图传上来供大家参考&#xff0c;后面我会讲具体怎么设计。希望大家多多关注 :)转载于:http…

开源项目贡献者_嘿新手开源贡献者:请写博客。

开源项目贡献者by Shubheksha通过Shubheksha 嘿新手开源贡献者&#xff1a;请写博客。 (Hey newbie open source contributors: please blog more.) As a newbie open source contributor, I often felt lost and dejected. I couldn’t figure out how different modules fit…

instanceof, isinstance,isAssignableFrom的区别

instanceof运算符 只被用于对象引用变量&#xff0c;检查左边的被测试对象 是不是 右边类或接口的 实例化。如果被测对象是null值&#xff0c;则测试结果总是false。 形象地&#xff1a;自身实例或子类实例 instanceof 自身类 返回true 例&#xff1a; String snew String(&qu…

POJ - 3538 - Domestic Networks

先上题目&#xff1a; Domestic NetworksTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 732 Accepted: 204 Special JudgeDescription Alex is a system administrator of Domestic Networks Inc. His network connects apartments and spans over multiple buil…

iOS HitTest 机制

当用户触摸&#xff08;Touch&#xff09;屏幕进行交互时&#xff0c;系统首先要找到响应者&#xff08;Responder&#xff09;。系统检测到手指触摸&#xff08;Touch&#xff09;操作的时候&#xff0c;将Touch 以UIEvent 的方式加入到UIApplication 事件队列中去。UIApplica…

巨石加密_缓解巨石

巨石加密by Ian Belcher伊恩贝尔彻(Ian Belcher) 我们如何将技术堆栈转向基于服务&#xff0c;以开发人员体验为中心的设计 (How we pivoted our tech stack to a service-based, developer experience-focused design) This article documents the problems we experienced w…

Python函数中的参数(一)

函数传递参数时的简要关键点&#xff1a; 1、参数的传递是通过自动将对象赋值给本地变量名来实现的。函数参数在实际中只是Python赋值的一个实例。因为引用是以指针的形式实现的&#xff0c;所有的参数实际上都是通过指针进行传递的。 2、在函数内部的参数名的赋值不会影响调用…

LLDB 调试相关

LLDB 初始 LLDB 是一个有着 REPL 的特性和 C ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部&#xff0c;存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它&#xff0c;你可以查看变量的值&#xff0c;执行自定的指令&#xff0c;并且按照你所认为合适的…

javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点

javascript优缺点by Preethi Kasireddy通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型&#xff1f; 优缺点 (Why use static types in JavaScript? The Advantages and Disadvantages) We covered a lot of ground in Part 1! With syntax out of the way, let’…

大数的减法函数--c语言

代码展示&#xff1a; http://paste.ubuntu.com/23693598/ #include<stdio.h> #include<stdlib.h> #include<string.h> char * largeDiffer(char *a,char *b){ /* 使用说明 传入的a和b只能为整数 结果为a-b;返回的为字符指针&#xff0c;注意数组不要越…

json 基础

json格式 JSON格式&#xff1a;http://www.json.org/ python和JSON的关系请参考&#xff1a;http://docs.python.org/library/json.html JSON建构有两种结构&#xff1a; 1. “名称/值”对的集合&#xff08;A collection of name/value pairs&#xff09;。不同的语言中&#…

iOS 中 load 和 initialize的实现顺序

1 load 函数 调用时机&#xff0c;当类引用进项目的时候执行load函数&#xff0c;在main函数开始之前&#xff0c;与 这个类是否被用到是无关的&#xff0c;每个类的load函数都会自动调用一次。 1 父类和子类都实现load函数的时候&#xff0c;父类的load方法优先于子类 2 类…

需求简报_代码简报:有史以来最怪诞的丑毛衣

需求简报Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; The geekiest ugly sweater ever: 4 minute read 有史以来最怪异的丑毛衣&#xff1a; 4分钟阅读 Lessons from my post-bootcamp job …

C#内置函数 RunSql的使用

作用批量执行sql语句表达式.RunSQL(SQLStatement,UseTransaction)表达式.一个代表DoCmd对象的变量。注释&#xff1a;sqlstatement参数的最大长度为 32,768 个字符&#xff08;而"宏"窗口中的 SQL 语句操作参数的最大长度为 256 个字符&#xff09;。 官方说仅能用于…

swif 在字符串中查找特定字符索引以及改变字符串的指定位置的颜色 字体大小

1 第一种方式 var text "谁包含这个字母";let range:Range<String.Index> text.range(of: "含")!;let end_idx:Int text.distance(from: text.startIndex, to: range.lowerBound);// 打印2print(end_idx);类方法 抽取 // 查找对应索引static func…

SD卡的控制方法(指令集和控制时序)

1.SD卡的命令格式&#xff1a; SD卡的指令由6字节(Byte)组成&#xff0c;如下&#xff1a; Byte1&#xff1a;0 1 x x x x x x(命令号&#xff0c;由指令标志定义&#xff0c;如CMD39为100111即16进制0x27&#xff0c;那么完整的CMD39第一字节为01100111&#xff0c;即0x270x40…

javascript 代码_代码简介:2016年JavaScript的现状

javascript 代码Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; The state of JavaScript in 2016: 5 minute read 2016年JavaScript状况&#xff1a; 阅读5分钟 Upgrading to macOS Sierra wi…

Unity协程截图,WWWForm、WWW配合上传

先说一下原理。。 截图有两种方法&#xff0c;第一种&#xff1a; Application.CaptureScreenshot(url); 这个API可以截全屏并保存到指定路径 这里我们不采用此方法 下面的代码采用第二种方法&#xff0c;自己建一个Texture2D 这种方法灵活&#xff0c;操作性更高 WWWForm方法是…