第三篇、FMDB使用
简介:
FMDB是基于SQlite3的封装一个第三方的OC库,操作起来更加简单,性能比Coredata更加高。
1.创建sqlite文件
2.导入FMDB头文件
3.创建数据库表table
4.编写sql语句
5.执行操作语句
1.使用示例:
class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
SQLiteManager.shareManager().openDB("hjq.sqlite") return true
}
}
2.创建数据库并建表
import UIKit class SQLiteManager: NSObject { /// 单例
private static let manager: SQLiteManager = SQLiteManager()
class func shareManager() -> SQLiteManager {
return manager
} var dbQueue: FMDatabaseQueue? /**
* 打开数据库
*/
func openDB(DBName: String)
{
// 1.根据传入的数据库名称拼接数据库路径
let path = DBName.docDir()
print(path) // 2.创建数据库对象
// 注意: 如果是使用FMDatabaseQueue创建数据库对象, 那么就不用打开数据库
dbQueue = FMDatabaseQueue(path: path) // 4.创建表
creatTable()
}
private func creatTable()
{
// 1.编写SQL语句
let sql = "CREATE TABLE IF NOT EXISTS T_Person( \n" +
"id INTEGER PRIMARY KEY AUTOINCREMENT, \n" +
"name TEXT, \n" +
"age INTEGER \n" +
"); \n" // 2.执行SQL语句
dbQueue!.inDatabase { (db) -> Void in
db.executeUpdate(sql, withArgumentsInArray: nil)
}
}
}
3.插入数据
// 1.定义SQL语句
let sql = "INSERT OR REPLACE INTO T_Status" +
"(statusId, statusText, userId)" +
"VALUES" +
"(?, ?, ?);" // 2.执行SQL语句(用事务)
SQLiteManager.shareManager().dbQueue?.inTransaction({ (db, rollback) -> Void in for dict in statuses
{
let statusId = dict["id"]!
// JSON -> 二进制 -> 字符串
let data = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
let statusText = String(data: data, encoding: NSUTF8StringEncoding)!
print(statusText)
if !db.executeUpdate(sql, statusId, statusText, userId)
{
// 如果插入数据失败, 就回滚
rollback.memory = true
} }
})
4.查找数据
// 1.定义SQL语句
var sql = "SELECT * FROM T_Status \n"
if since_id >
{
sql += "WHERE statusId > \(since_id) \n"
}else if max_id >
{
sql += "WHERE statusId < \(max_id) \n"
} sql += "ORDER BY statusId DESC \n"
sql += "LIMIT 20; \n" // 2.执行SQL语句
SQLiteManager.shareManager().dbQueue?.inDatabase({ (db) -> Void in // 2.1查询数据
// 返回字典数组的原因:通过网络获取返回的也是字典数组,
// 让本地和网络返回的数据类型保持一致, 以便于我们后期处理
var statuses = [[String: AnyObject]]() if let res = db.executeQuery(sql, withArgumentsInArray: nil)
{
// 2.2遍历取出查询到的数据
while res.next()
{
// 1.取出数据库存储的一条微博字符串
let dictStr = res.stringForColumn("statusText") as String
// 2.将微博字符串转换为微博字典
let data = dictStr.dataUsingEncoding(NSUTF8StringEncoding)!
let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [String: AnyObject]
statuses.append(dict)
} // 3.返回数据
finished(statuses) } // 3.返回数据
finished(statuses) })
5.删除和更新
// 1.定义SQL语句
let sql = "DELETE FROM T_Status WHERE createDate <= '\(dateStr)';" // 2.执行SQL语句
SQLiteManager.shareManager().dbQueue?.inDatabase({ (db) -> Void in
db.executeUpdate(sql, withArgumentsInArray: nil)
})
附:
String分类获取文件目录
import UIKit extension String{
/**
将当前字符串拼接到cache目录后面
*/
func cacheDir() -> String{
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString
return path.stringByAppendingPathComponent((self as NSString).lastPathComponent)
}
/**
将当前字符串拼接到doc目录后面
*/
func docDir() -> String
{
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString
return path.stringByAppendingPathComponent((self as NSString).lastPathComponent)
}
/**
将当前字符串拼接到tmp目录后面
*/
func tmpDir() -> String
{
let path = NSTemporaryDirectory() as NSString
return path.stringByAppendingPathComponent((self as NSString).lastPathComponent)
}
}
第三篇、FMDB使用的更多相关文章
- iOS开发数据库篇—FMDB简单介绍
iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...
- iOS开发数据库篇—FMDB数据库队列
iOS开发数据库篇—FMDB数据库队列 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: // // YYViewContr ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
- 我的屌丝giser成长记-研三篇
进入研三以来,基本都是自己的自由时间了,从导师的项目抽离出来,慢慢的都交给师弟他们来负责.研三的核心任务就是找工作以及写毕业论文,因为有导师科研基金项目成果作为支撑,所以自己的论文没什么可担心,一切都 ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- 前端工程师技能之photoshop巧用系列第三篇——切图篇
× 目录 [1]切图信息 [2]切图步骤 [3]实战 前面的话 前端工程师除了使用photoshop进行测量之外,更重要的是要使用该软件进行切图.本文是photoshop巧用系列的第三篇——切图篇 切 ...
- 解剖SQLSERVER 第三篇 数据类型的实现(译)
解剖SQLSERVER 第三篇 数据类型的实现(译) http://improve.dk/implementing-data-types-in-orcamdf/ 实现对SQLSERVER数据类型的解 ...
随机推荐
- [Objective-c 基础 - 3.4] protocol
A.概念 1.用来声明方法(不能声明成员变量) 2.只要某个类遵守了这个协议,相当于拥有了协议中得所有方法的声明 3.属性 (1)@required:默认,要求实现,不实现就会发出警告 (2)@opt ...
- 转载StringBuilder说明
动态串StringBuilder 利用System.Text.StringBuilder类实现动态字符串,动态的含义是指在修改字符串时,系统不需要创建新的对象,不会重复开辟新的内存空间,而是直接在原来 ...
- MySql实现远程连接
MySql实现远程连接 1.进入mysql,创建一个新用户root,密码为root: 格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密 ...
- C# Winform 支持Hex与ASCII输入和切换的文本框
最近一直在做一个支持串口,TCP,UDP通讯调试的一体化工具(也就是C#串口调试工具 v2.0的第三版),其中涉及到16进制数据和ASCII码的输入,所以继承了TextBox的基础上,写了这个支持He ...
- cocos2d-x Touch
转自:http://codingnow.cn/cocos2d-x/783.html 游戏跟视频最大的区别就是互动,玩家可以操控游戏中的角色,现在的移动设备几乎人手一台,基本上全部都是基于触屏操作的,今 ...
- Codeforces Codeforces Round #319 (Div. 2) A. Multiplication Table 水题
A. Multiplication Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/57 ...
- 【Android开发】完美解决Android完全退出程序
背景:假说有两个Activity, Activity1和Activity2, 1跳转到2,如果要在2退出程序,一般网上比较常见的说法是用 System.exit(0) 或是 android.os.Pr ...
- SAP交货单过账自动生产采购订单、采购订单自动收货入库
公司间需要买卖操作,由于发货和收货都是同一批人在操作,为了减少业务人员的工作量,提高工作效率,特实现以上功能 1.增强实现:增强点为交货单过账成功时触发,在提交前触发,如果遇到不可预知问题,可能造成数 ...
- Python 魔术方法指南
入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...
- android118 上拉下拉刷新列表listView实现
MainActivity.java package com.heima52.pullrefresh; import java.util.ArrayList; import com.heima52.pu ...