• 第三篇、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( " + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT, " + "age INTEGER " + "); " // 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 
    "
            if since_id > 0
            {
                sql += "WHERE statusId > (since_id) 
    "
            }else if max_id > 0
            {
                sql += "WHERE statusId < (max_id) 
    "
            }
            
            sql += "ORDER BY statusId DESC 
    "
            sql += "LIMIT 20; 
    "
            
            // 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)
        }
    }
  • 相关阅读:
    用instr 直接取最右端的点的位置:
    ASP FSO操作文件(复制文件、重命名文件、删除文件、替换字符
    Ubuntu 16.04系统下安装RapidSVN版本控制器及配置diff,editor,merge和exploer工具
    Ubuntu 16.04系统下开机提示“无法应用原保存的显示器配置”
    Ubuntu 16.04系统下出现E: 无法下载 http://ppa.launchpad.net/fcitx-team/nightly/ubuntu/dists/xenial/main/binary-amd64/Packages 404 Not Found
    Ubuntu 16.04系统下软件中心Software闪退解决办法
    UEditor富文本WEB编辑器自定义默认值设置方法
    HTML5 移动页面自适应手机屏幕四类方法
    Ubuntu 16.04系统下apt-get和dpkg区别
    jQuery相同id元素 全部获取问题解决办法
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/5797711.html
Copyright © 2020-2023  润新知