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

SQLite数据库框架之FMDB(Swift)

FMDB使用FMDB是iOS平台的SQLite数据库框架FMDB以OC的方式封装了SQLite的C语言APIFMDB的优点使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码对比

FMDB使用

  • FMDB是iOS平台的SQLite数据库框架
  • FMDB以OC的方式封装了SQLite的C语言API
FMDB的优点
  • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
  • 对比苹果自带的Core Data框架,更加轻量级和灵活
  • 提供了多线程安全的数据库操作方法,有效地防止数据混乱

使用框架

  • 官网地址
    https://github.com/ccgus/fmdb
  • CocoaPods 集成 FMDB

use_frameworks!
pod 'FMDB'

核心类

  • FMDB核心类:
  • FMDatabase: 一个FMDatabase表示一个sqlite数据库.所有对数据库的操作都是通过这个类
  • executeStatements: 执行多条sql

* executeQuery: 执行查询语句
* executeUpdate: 执行除查询以外的语句,create, drop, insert, delete, update

  • FMDatabaseQueue: 内部封装FMDatabase和串行queue,用于多线程操作数据库,并且提供事务,建议使用这个
  • inDatabase: 参数是一个闭包,在闭包里面可以获得FMDatabase对象

* inTransaction: 使用事务.

  • FMResultSet: 查询的结果集
    通过字段名称获取字段值

FMDB使用

  • 建立SQLiteManager.swift 单例对象

class SQLiteManager: NSObject {
// 单例
static let sharedManager = SQLiteManager()
let dbQueue: FMDatabaseQueue
override init() {
let documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString
let path = documentPath.stringByAppendingPathComponent("fmdb.db")
print("path: \(path)")
// 创建FMDatabaseQueue对象会自动打开数据库,如果数据库不存在会创建数据库
// 后续的所有数据库操作都是通过dbQueue来调用
dbQueue = FMDatabaseQueue(path: path)
super.init()
// 创建数据表
createTable()
}
private func createTable() {
// 之前的sql语句都是在代码里面在写的,通过文件来加载sql语句,在文件中可以编写多条sql语句
// 获取table.sql文件的路径
let bundlePath = NSBundle.mainBundle().pathForResource("table", ofType: "sql")!
// 加载table.sql文件里的内容
let sql = try! String(contentsOfFile: bundlePath)
// print("加载文件sql: \(sql)")
dbQueue.inDatabase { (db) -> Void in
db.executeStatements(sql)
}
}
}

  • 测试FMDB

  • 测试FMDB插入单条数据

/**
测试FMDB插入单条数据
*/
func testInsert() {
// 插入数据sql
let sql = "INSERT INTO T_Person (name, age, height) VALUES ('赵六6', 26, 1.70);"
SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
do {
try db.executeUpdate(sql, values: [])
print("插入数据成功")
// 获取插入数据的主键
let id = db.lastInsertRowId()
print("插入数据的id: \(id)")
} catch let error as NSError {
print("error: \(error)")
}
}
}

  • 测试FMDB大批量添加数据

/**
测试FMDB大批量添加数据
*/
func testManyInsert() {
// 插入数据sql
let sql = "INSERT INTO T_Person (name, age, height) VALUES (?, ?, ?);"
SQLiteManager.sharedManager.dbQueue.inTransaction { (db, rollback) -> Void in
// 添加10000条数据
do {
let start = CFAbsoluteTimeGetCurrent()
for i in 0..<10000 {
try db.executeUpdate(sql, values: ["lisi\(i)", 20, 1.72])
}
let end = CFAbsoluteTimeGetCurrent()
print("消耗时间:\(end - start)")
} catch {
}
}
}

  • 事务回滚

/**
测试FMDB大批量添加数据
*/
func testManyInsert() {
// 插入数据sql
let sql = "INSERT INTO T_Person (name, age, height) VALUES (?, ?, ?);"
SQLiteManager.sharedManager.dbQueue.inTransaction { (db, rollback) -> Void in
// 添加10000条数据
do {
let start = CFAbsoluteTimeGetCurrent()
for i in 0..<10000 {
try db.executeUpdate(sql, values: ["lisi\(i)", 20, 1.72])
// 模拟数据错误,回滚事务
if i == 1000 {
// UnsafeMutablePointer: 表示 ObjCBool类型的指针
// 在OC中: *rollback = YES
// 在swift中rollback.memory = true 表示设置ObjCBool的值为true
print("数据出错,回滚")
rollback.memory = true
break
}
}
let end = CFAbsoluteTimeGetCurrent()
print("消耗时间:\(end - start)")
} catch {
}
}
}

  • 测试FMDB修改数据

/**
测试FMDB修改数据
*/
func testUpdate() {
SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
let sql = "UPDATE T_Person SET name = ? WHERE id = ?;"
do {
try db.executeUpdate(sql, values: ["liedehua", 1])
print("更新数据成功")
} catch let error as NSError {
print("error: \(error)")
}
}
}

  • 测试FMDB查询

/**
测试FMDB查询
*/
func testQuery() {
SQLiteManager.sharedManager.dbQueue.inDatabase { (db) -> Void in
do {
// 查询sql语句
let sql = "SELECT id, name, age, height FROM T_Person LIMIT ?;"
let result = try db.executeQuery(sql, values: [20])
while result.next() {
// 通过字段名称获取字段值
let id = result.intForColumn("id")
let name = result.stringForColumn("name")
let age = result.intForColumn("age")
let height = result.doubleForColumn("height")
print("id: \(id), name: \(name), age: \(age), height: \(height)")
print("------------")
}
} catch let error as NSError {
print("error: \(error)")
}
}
}

推荐阅读
  • iOS——应用内调用Face ID、Touch ID
    注意到很多iOS非原生应用都在应用内调用了FaceID,以来辅助登陆和进行隐私操作的确认,下面是如何调用FaceID或TouchID。获取用户隐私权限 ... [详细]
  • 本文介绍了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应用,处理来自服务器的JSON数据是一项基本技能。无论是使用Swift还是PHP,有效地解析和利用JSON数据对于提升用户体验至关重要。本文将探讨如何在Swift中优雅地处理JSON,以及PHP中处理JSON的一些技巧。 ... [详细]
  • 抽象工厂模式 c++
    抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 导读:本文来自SwiftGG翻译组,作者@walkingway基于苹果Swift官方博客中TedKremenek所撰写的“Swift2.2Released!”文章进行了关于Swift2. ... [详细]
  • WhenImtryingtorunthefollowing:当我试图运行以下内容时:ContentValuescvnewContentValues();cv ... [详细]
  • 我正在一个涉及SQLite的项目中,我只有一个数据库文件,现在我正在测试我的应 ... [详细]
  • SQLite3是一个广泛使用的数据库,从linux,windows到安卓都有SQLite的应用。本文介绍SQLite3在windows上的编译。SQLite3提供了多种源代码的下载 ... [详细]
  • 代码生成器实战教程:提升编程效率的利器
    本系列文章旨在通过一系列实践案例,详细介绍如何利用代码生成器提高开发效率。本文将引导您完成从下载安装到实际应用的全过程。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 解决UIBarButtonItem 边缘显示异常的问题分析与优化方案
    在iOS开发中,针对UIBarButtonItem边缘显示异常的问题进行了深入分析,并提出了一系列优化方案。通过自定义视图和调整布局约束,有效解决了按钮在不同设备和屏幕尺寸下的显示问题,提升了用户体验。具体方法包括使用AutoLayout进行动态调整,以及对按钮的内边距和外边距进行精细控制,确保按钮在各种场景下都能保持良好的视觉效果。 ... [详细]
author-avatar
手机用户2702934194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有