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 驱动程序介绍,如何绑定设备到驱动程序,以IOCTL Interface、CYIOCTL.Hd的解释为主要内容的编程指导,主…

对象冒充_使用您的精神探照灯进行冒充冒名顶替综合症
对象冒充by Jaime J. Rios由Jaime J. Rios “Stop that imposter! Seize them!”“停止冒名顶替者! 抓住他们!” I first spotted my imposter two years ago. It happened when I began learning how to code.两年前,我第一次发现了冒名顶…

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

iOS weak 自动置为nil的实现
1 weak 自动置为nil的实现 runtime 维护了一个Weak表,weak_table_t 用于存储指向某一个对象的所有Weak指针。Weak表其实是一个哈希表, key是所指对象的地址,value是weak指针的地址的数组。 在对象回收的时候,就会在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 数据结构的简要介绍:图形如何工作 (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. 介绍 这篇文章主要是为了说明,我们为什么要使用Catel框架作为开发WPF,Silverlight,和Windows phone7应用程序的开发框架。 2. 通用功能 2.1. 这是你的选择 针对需对开发者,再使用架构的时候是希望有很大的自由度的,但是大部…

iOS 三种类型的Block
Block 的copy 操作 Block 其实来讲有三种类型 全局块 NSConcreteGlobalBlock 栈块 NSConcreteStackBlock 堆块 NSConcreteMallocBlock 全局块存储在全局内存中,相当于单例 栈块存于栈内存中,超出其作用域则马上进行销毁 堆块存在于堆内存中&#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 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍sqlalchemy安装sqlalchemy基本使用多外键关联多对多关系表结构设计作业1. ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切…

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

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

开源项目贡献者_嘿新手开源贡献者:请写博客。
开源项目贡献者by Shubheksha通过Shubheksha 嘿新手开源贡献者:请写博客。 (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运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。如果被测对象是null值,则测试结果总是false。 形象地:自身实例或子类实例 instanceof 自身类 返回true 例: String snew String(&qu…

POJ - 3538 - Domestic Networks
先上题目: 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 机制
当用户触摸(Touch)屏幕进行交互时,系统首先要找到响应者(Responder)。系统检测到手指触摸(Touch)操作的时候,将Touch 以UIEvent 的方式加入到UIApplication 事件队列中去。UIApplica…

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

Python函数中的参数(一)
函数传递参数时的简要关键点: 1、参数的传递是通过自动将对象赋值给本地变量名来实现的。函数参数在实际中只是Python赋值的一个实例。因为引用是以指针的形式实现的,所有的参数实际上都是通过指针进行传递的。 2、在函数内部的参数名的赋值不会影响调用…
LLDB 调试相关
LLDB 初始 LLDB 是一个有着 REPL 的特性和 C ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的…

javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点
javascript优缺点by Preethi Kasireddy通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? 优缺点 (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语言
代码展示: http://paste.ubuntu.com/23693598/ #include<stdio.h> #include<stdlib.h> #include<string.h> char * largeDiffer(char *a,char *b){ /* 使用说明 传入的a和b只能为整数 结果为a-b;返回的为字符指针,注意数组不要越…

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

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

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

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

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卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x270x40…

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

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