热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite的使用——Swift代码

一、添加”libsqlite3.dylib”库文件写一个头文件SQLite_Bridge.h将SQLite连接二、代码结构三、代码实现1.AppDelegate.swiftimport

一、添加”libsqlite3.dylib”库文件

这里写图片描述

写一个头文件SQLite_Bridge.h

这里写图片描述

将SQLite连接

这里写图片描述

二、代码结构

这里写图片描述

三、代码实现

1.AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

let flag = SQLiteManager.shareInstance().openDB()
if flag {
print("打开数据库成功")
}

return true
}
}

2.ViewController.swift

import UIKit

/*
0.封装一个工具类,管理SQLite的数据库(单例)
1.创建数据库(文件)
2.创建表,用于存储数据
3.基本操作(增删改)
4.查询数据
*/

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}

override func touchesBegan(touches: Set, withEvent event: UIEvent?) {

// 1.开启事务
SQLiteManager.shareInstance().beginTransaction()

let time = CFAbsoluteTimeGetCurrent()

// 2.执行操作
for _ in 0..<10000 {
let name = "ls\(arc4random_uniform(20))"
let age = Int(arc4random_uniform(10) + 15)
let stu = Student(age: age, name: name)
stu.insertStudent()

// if i == 50 {
// // 回滚事务
// SQLiteManager.shareInstance().rollBackTransaction()
// break
// }
}

let end = CFAbsoluteTimeGetCurrent();

print(end - time)

// 3.提交事务
SQLiteManager.shareInstance().commitTransaction()

// deleteData()
// updateData()

// let array = Student.loadData()
// print(array);
}

func deleteData() {
// 1.封装删除的sql
let deleteSQL = "DELETE FROM t_student WHERE name = 'ls11';"

// 2.执行sql
if SQLiteManager.shareInstance().execSQL(deleteSQL) {
print("删除成功")
}
}

func updateData() {
// 1.封装更新的sql
let updateSQL = "UPDATE t_student SET name = 'lmj' WHERE name = 'ls1';"

// 2.执行sql
if SQLiteManager.shareInstance().execSQL(updateSQL) {
print("更新成功")
}
}
}

3.SQLiteManager.swift

import UIKit

class SQLiteManager: NSObject {

// 定义单例的属性,使用let定义的属性本身就是线程安全
static let instance : SQLiteManager = SQLiteManager()

// 对外提供一个接口,返回单例实例
class func shareInstance() -> SQLiteManager {
return instance
}

// MARK:- 创建数据库和表的方法
var db : COpaquePointer = nil

func openDB() -> Bool {
// 1.获取数据库存放的路径
var filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first;
filePath = (filePath! as NSString).stringByAppendingPathComponent("my.sqlite")
let cFilePath = (filePath?.cStringUsingEncoding(NSUTF8StringEncoding))!

print(filePath)

// 2.打开数据库
if sqlite3_open(cFilePath, &db) != SQLITE_OK {
print("打开数据库失败");
return false
}

// 3.创建表
return createTable()
}

func createTable() -> Bool {
// 1.封装创建表的SQL语句
let createTableSQL = "CREATE TABLE IF NOT EXISTS 't_student' ('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);"

// 2.执行SQL语句
return execSQL(createTableSQL)
}

func execSQL(sql : String) -> Bool {
// 1.将语句转成c语言字符串
let cSQL = (sql.cStringUsingEncoding(NSUTF8StringEncoding))!

return sqlite3_exec(db, cSQL, nil, nil, nil) == SQLITE_OK
}

// MARK:- 查询语句
func querySQL(querySQL : String) -> [[String : AnyObject]]? {
// 0.游标对象
var stmt : COpaquePointer = nil

// 1.将查询语句转成C语言的字符串
let cQuerySQL = (querySQL.cStringUsingEncoding(NSUTF8StringEncoding))!

// 2.准备工作
if sqlite3_prepare_v2(db, cQuerySQL, -1, &stmt, nil) != SQLITE_OK {
print("没有准备成功")
return nil
}

// 3.查询数据
var tempArray = [[String : AnyObject]]()
let count = sqlite3_column_count(stmt)
while sqlite3_step(stmt) == SQLITE_ROW {
var dict = [String : AnyObject]()
for i in 0.. // 1.取出key
let cValue = UnsafePointer(sqlite3_column_text(stmt, i))
let value = String(CString: cValue, encoding: NSUTF8StringEncoding)!

// 2.取出值
let cKey = sqlite3_column_name(stmt, i)
let key = String(CString: cKey, encoding: NSUTF8StringEncoding)!

// 3.将键值对添加到字典中
dict[key] = value
}

tempArray.append(dict)
}

return tempArray
}

// MARK:- 事务的封装
func beginTransaction() {
execSQL("BEGIN TRANSACTION;")
}

func rollBackTransaction() {
execSQL("ROLLBACK TRANSACTION;")
}

func commitTransaction() {
execSQL("COMMIT TRANSACTION;")
}
}

4.Student.swift

import Foundation

class Student: NSObject {
var name : String?
var age : Int = 0

init(age : Int, name : String) {
self.name = name
self.age = age
}

init(dict : [String : AnyObject]) {
super.init()
self.setValuesForKeysWithDictionary(dict)
}

func insertStudent() {
// 1.拼接插入的sql语句
let insertSQL = "INSERT INTO t_student (name, age) VALUES ('\(name!)', \(age));"

// 2.执行sql
if SQLiteManager.shareInstance().execSQL(insertSQL) {
}
}

class func loadData() -> [Student]? {
// 1.定义查询语句
let querySQL = "SELECT name, age FROM t_student WHERE age >= 20 ORDER BY age;"

// 2.执行查询语句
let dictArray = SQLiteManager.shareInstance().querySQL(querySQL)

// 3.遍历字典中所有的数据,转成模型对象
var tempArray = [Student]()
if let tempDictArray = dictArray {
for dict in tempDictArray {
tempArray.append(Student(dict: dict))
}
}

return tempArray
}
}

5.SQLite_Bridge.h

#import "SQLite3.h"

推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
乳酪杳杳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有