FMDB在Swift中的基本使用

?什么是FMDB

  1. FMDB是iOS平台的SQLite数据库框架
  2. FMDB以OC的方式封装了SQLite的C语言API

?FMDB的优点

  1. 使用起来更加面向对象,省去了很多麻烦、繁杂的C语言代码
  2. 提供了多线程数据库的操作方法,有效的防止数据混乱

FMDB有三个主要的类

?FMDatabase

  1. 一个FMDBDatabase对象就代表一个单独的SQLite数据库
  2. 用来执行SQL语句

?FMResultSet

  1. 使用FMDatabase执行查询后的结果集

?FMDatabaseQueue

  1. 用于在多线程中查询或者更新,它是线程安全的

使用

  • 在github上下载文件,导入文件 包括第二个文件FMDB及第一个文件里面的为swift提供的头文件
  • 添加并配置桥接文件 并#import
  • 导入sqlite3.tbd框架 编译看是否报错

下载地址 https://github.com/ccgus/fmdb


代码:

在APPdelegate里面创建数据库执行以下代码  SQLiteManager.shareManager().openDB("person.sqlite")


FMDB管理类

import UIKit

class SQLiteManager: NSObject {
   
    privatestaticlet manager: SQLiteManager = SQLiteManager()
    /// 单粒
    classfunc shareManager() -> SQLiteManager {
        return manager
    }
   
   
    var db: FMDatabase?
    /**
    *  打开数据库
     数据库的关闭:
        1.一般在服务端使用数据库要使用完一次就要立刻关闭防止数据混乱
        2.客户端不存在多个运用程序使用一个数据库的情况,不用关闭,可以减少性能消耗
    */
    func openDB(DBName: String)
    {
        // 1.根据传入的数据库名称拼接数据库路径
        let path = docDir(DBName)
        print(path)
       
        // 2.创建数据库对象
        db = FMDatabase(path: path)
       
        // 3.打开数据库
        // open方法特点: 如果指定路径对应的数据库文件已经存在, 就会直接打开如果指定路径对应的数据库文件不存在, 就会创建一个新的
        if !db!.open()
        {
            print("打开数据库失败")
            return
        }
       
        // 4.创建表
        creatTable()
    }
    func docDir(str:String) -> String
    {
        let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!  asNSString
//        return path.stringByAppendingPathComponent((self as NSString).lastPathComponent)
        return path.stringByAppendingPathComponent((str asNSString).lastPathComponent)
    }
    privatefunc 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语句
        // 注意点: 在FMDB中除了查询意外, 都称之为更新
        ifdb!.executeUpdate(sql, withArgumentsInArray: nil)
        {
            print("创建表成功")
        }else
        {
            print("创建表失败")
        }

}


Model处理数据类

import UIKit

class Person: NSObject {
    var id: Int = 0
    var age: Int = 0
    var name: String?
   
   
    // MARK: - 执行数据源CRUD的操作
    classfunc loadPersons() -> [Person]
    {
        let sql = "SELECT * FROM T_Person;"
        let res = SQLiteManager.shareManager().db!.executeQuery(sql, withArgumentsInArray: nil)
       
        var models = [Person]()
        // next取出一行数据
        while res.next()
        {
            let p = Person()
            let num = res.intForColumn("id")
            let name = res.stringForColumn("name")
            let age = res.intForColumn("age")
//            print("num = \(num), name = \(name), age = \(age)")
            p.id = Int(num)
            p.name = name
            p.age = Int(age)
            models.append(p)
        }
        return models
    }
   
   
    /**
    插入一条记录
    */
    func insertPerson() -> Bool
    {
       
        assert(name != nil, "必须要给name赋值")
       
        // 1.编写SQL语句
        let sql = "INSERT INTO T_Person" +
        "(name, age)" +
        "VALUES" +
        "(?, ?);"

// 2.执行SQL语句
//        return SQLiteManager.shareManager().db!.executeUpdate(sql, withArgumentsInArray: nil)
       
        returnSQLiteManager.shareManager().db!.executeUpdate(sql, name!, age)
    }
   
    // MARK: - 系统内部方法
    init(dict: [String: AnyObject])
    {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
   
    overrideinit()
    {
        super.init()
    }
   
    overridefunc setValue(value: AnyObject?, forUndefinedKey key: String) {
       
    }
   
    overridevar description: String
        {
        return"id = \(id), age = \(age), name = \(name)"    }

}

}

时间: 2024-11-05 22:50:22

FMDB在Swift中的基本使用的相关文章

Swift 中的Range和NSRange不同

Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧. 看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串: ? 1 2 3 4 5 6 var str = "Hello, playground"   let ran

Swift 中的基础语法(二)

1.Swift 中的函数 /// 函数的定义 /// /// - Parameters: /// - x: 形参 /// - y: 形参 /// - Returns: 返回值 func sum(x: Int, y: Int) -> Int { return x + y } print(sum(x: 10, y: 20))   /* 外部参数就是在形参前面加了一个字 外部参数不会影响函数内部的细节 外部参数会让外部调用看起来更加直观 外部参数如果使用了'_',在外部调用函数时,会忽略形参的名字 &qu

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret

swift中代理的使用

下面以自定义的UITableViewCell的代理为例,记录一下swift中代理的使用 controller中的代码如 1 // 2 // ViewController.swift 3 // simpleDemo 4 // 5 // Created by liubo on 16/7/25. 6 // Copyright © 2016年 liubo. All rights reserved. 7 // 8 9 import UIKit 10 11 class ViewController: UIV

SWIFT中的repeat...while

SWIFT中的repeat...while类似于JAVA\.NET中的 do while.大同小异只是把do换成了repeat var index = 10 repeat{ print(index) index-- } while(index>0)

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr

[Swift中错误]missing argument label 'greeting:' in call

Swift 中出现这个问题:从第二个参数起,自动加上lable func sayHello(name:String? ,greeting:String)->String { let result = greeting + "," + (name ?? "Guest") + "!" return result } var nickname:String? nickname = "yc" //“Goodmorning前面应该

在Swift中使用遗留的C API

Swift的类型系统的设计目的在于简化我们的生活,为此它强制用户遵守严格的代码规范来达到这一点.毫无疑问这是一件大好事,它鼓励程序员们编写 更好更正确的代码.然而,当Swift与历史遗留的代码库.特别是C语言库进行交互时,问题出现了.我们需要面对的现实是许多C语言库滥用类型,以至于它 们对Swift的编译器并不友好.苹果的Swift团队的确花了不少功夫来支持C的一些基础特性,比如C字符串.但当在Swift中使用历史遗留的C语言 库时,我们还是会面临一些问题.下面我们就来解决这些问题. 在开始之前