分类 swift 下的文章

CoreData基本使用

里面的代码都是在xcode已经设置好的前提下进行的,怎么在xcode中添加model之类的,就不记录了,在这里记录下代码

//
//  ViewController.swift
//  CoreData基本使用
//
//  Created by admin on 16/3/14.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit
import CoreData
class ViewController: UIViewController {
    lazy var dbFilePath:String = {
        // 数据库保存的路径,这里是设置的沙盒的缓存文件
        // let temp = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as String)/testdb.sqlite"
        // 数据库的保存路径,方便查看,所以写了个固定的目录
        let temp = "/Users/admin/sqllite/testdb.sqlite"
        return temp
    }()
    lazy var fileDirectory:String = {
        // 数据库保存的路径,这里是设置的沙盒的缓存文件
        // let temp = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as String)/"
        // 数据库的保存路径,方便查看,所以写了个固定的目录
        let temp = "/Users/admin/sqllite/"
        return temp
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
//        self.setContext()
        self.setContextWithModelName("UserModel")
        self.insertGroup()
    }
    // 根据模型设置上下文,setContext方法会把所有的模型的表保存在同一个数据库文件中,这里可以根据那个传递的模型名称分开保存
    func setContextWithModelName(modelName:String)
    {
        let context = NSManagedObjectContext()
        let path = NSBundle.mainBundle().pathForResource(modelName, ofType: "momd")
        let model = NSManagedObjectModel(contentsOfURL: NSURL(fileURLWithPath: path!))
        let story = NSPersistentStoreCoordinator(managedObjectModel: model!)
        let savePath = "\(self.fileDirectory)\(modelName).sqlite"
        let _ = try? story.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: NSURL(fileURLWithPath: savePath), options: nil)
        context.persistentStoreCoordinator = story
        self.context = context
    }
    // 根据分组查询用户
    func selectUserWithGroup()
    {
        let request = NSFetchRequest(entityName: "Group")

        let pre = NSPredicate(format: "name = %@", argumentArray: ["管理员"])
        request.predicate = pre

        let groups:[Group]? = try? self.context?.executeFetchRequest(request) as! [Group]

        let requesUser = NSFetchRequest(entityName: "User")
        // 设置查询条件
        let preUser = NSPredicate(format: "group = %@", argumentArray: [groups![0]])
        requesUser.predicate = preUser

        let users:[User]? = try? self.context?.executeFetchRequest(requesUser) as! [User]

        for user in users!
        {
            print("用户名:\(user.name)")
            print("密码:\(user.password)")
            print("年龄:\(user.age)")
            // 这个字断是一个对象,但是需要转一下,有点麻烦啊,不知道有没有更好的方法
            let temp = user.group as! Group
            print("分组:\(temp.name)")
            print("*******************")
        }

    }
    func insertUser()
    {
        /**
        let num = 40000
        var sum = 0
        for var i = 0; i < num;i++
        {
            sum += i
        }
        print(sum)
        */
        let request = NSFetchRequest(entityName: "Group")
        // 获得所有分组
        let groups:[Group]? = try? self.context?.executeFetchRequest(request) as! [Group]

        let num = 100
        // 循环插入100个小芳
        for var i = 0; i < num;i++
        {
            let user:User = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: self.context!) as! User
            user.name = "小芳\(arc4random_uniform(100000))"
            user.age = NSNumber(unsignedInt: arc4random_uniform(100000))
            user.password = "\(arc4random_uniform(999999999))"
            user.group = groups?[Int(arc4random_uniform(UInt32((groups?.count)!)))]
            let _ = try? self.context?.save()
        }
    }
    // 插入关联表数据,这里是用户分组表
    func insertGroup()
    {
        let groupA:Group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext: self.context!) as! Group
        groupA.name = "管理员"
        let groupB:Group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext: self.context!) as! Group
        groupB.name = "游客"
        let _ = try? self.context?.save()
    }

    // 按条件查询
    func select()
    {
        let request = NSFetchRequest(entityName: "User")
        // 查询出在18岁和24岁之间的小芳
//        let pre = NSPredicate(format: "age <= %@ and age >= %@", argumentArray: [24,18])
        // 查询出名字中包含 22 的小芳
        let pre = NSPredicate(format: "name like %@", argumentArray: ["*22*"])

        request.predicate = pre

        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]
        // 输出
        for user in users!
        {
            print("名字:\(user.name)")
            print("密码:\(user.password)")
            print("年龄:\(user.age)")
            print("***********")
        }
    }
    // 修改
    func update()
    {
        // 修改年龄
        // 1.查找到要删除的对象
        let request = NSFetchRequest(entityName: "User")

        // 条件,age 小于等于 0
        let pre = NSPredicate(format: "age <= %@", argumentArray: [0])

        request.predicate = pre;

        // 2.先读取出用户
        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]
        // 改成 18
        for user in users!
        {
//            self.context?.deleteObject(user)
            user.age = 18
            // [self.context deleteObject:emp];
        }

        // 3.用context同步下数据库
        //所有的操作暂时都是在内存里,调用save 同步数据库
        let _ = try? self.context?.save()
    }
    // 删除
    func delete()
    {
        // 删除zhangsan
        // 1.查找到要删除的对象
        let request = NSFetchRequest(entityName: "User")

        // 条件,age字段等于 15089 的
        let pre = NSPredicate(format: "age=%@", argumentArray: [15089])

        request.predicate = pre;

        // 2.删除zhangsan
        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]

        for user in users!
        {
            self.context?.deleteObject(user)
            // [self.context deleteObject:emp];
        }

        // 3.用context同步下数据库
        //所有的操作暂时都是在内存里,调用save 同步数据库
        let _ = try? self.context?.save()
    }
    // 添加数据
    func insert()
    {
        for var i = 0;i < 100;i++
        {
            // 创建模型对象
            let user:User = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: self.context!) as! User
            // 设置模型属性
            user.name = "小芳\(rand())"
            user.password = "\(rand())"
            user.age = NSNumber(int: rand())
            //保存 - 通过上下文操作
            if (try? self.context?.save()) == nil
            {
                print("error")
            }
            else
            {
                print("ok")
            }
        }
    }
    // 所有的操作都需要上下文
    var context:NSManagedObjectContext?
    // 获得上下文
    func setContext()
    {
        // 1.上下文 关联UserModel.xcdatamodeld 模型文件
        let context = NSManagedObjectContext()

        // 关联模型文件

        // 创建一个模型对象
        // 传一个nil 会把 bundle 下的所有模型文件(xcdatamodeld后缀的文件) 关联起来
        let model = NSManagedObjectModel.mergedModelFromBundles(nil)

        // 持久化存储调度器
        let store = NSPersistentStoreCoordinator(managedObjectModel: model!)

        // 数据库保存的路径
        let fielPath = self.dbFilePath

        //
        let res = try? store.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: NSURL(fileURLWithPath: fielPath), options: nil)

        if res != nil
        {
            context.persistentStoreCoordinator = store
        }
        // 完成上下文的初始化
        self.context = context;
    }
}

FMDB的基本使用

//
//  FMDBTestController.swift
//  微博项目
//
//  Created by zhang on 16/3/13.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class FMDBTestController: UIViewController {
    var queue:FMDatabaseQueue?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.whiteColor()
        // 拼接文件名
        let filePath = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!)database.sqlite"
        print(filePath)
        self.queue = FMDatabaseQueue(path: filePath)

        // Do any additional setup after loading the view.
    }
    @IBAction func createTable(sender: AnyObject) {
        let sql = "create table if not exists t_user (id integer primary key autoincrement,name text,phone text);"
        // 创建数据库表
        // 提供了一个多线程安全的数据库实例
        self.queue?.inDatabase({ (database:FMDatabase!) -> Void in
            let flag = database.executeUpdate(sql, withArgumentsInArray: nil)
            if (flag) {
                print("ok")
            }else{
                print("error")
            }
        })

    }

    @IBAction func insert(sender: AnyObject) {
        let sql = "insert into t_user (name,phone) values (?,?)"
        self.queue?.inDatabase({ (database:FMDatabase!) -> Void in
            let flag = database.executeUpdate(sql, withArgumentsInArray: ["\(rand())","\(rand())"])
            if (flag) {
                print("ok")
            }else{
                print("error")
            }
        })
    }
    @IBAction func deleteTest(sender: AnyObject) {
        let sql = "DELETE FROM t_user "
        self.queue?.inDatabase({ (database:FMDatabase!) -> Void in
            let flag = database.executeUpdate(sql, withArgumentsInArray: nil)
            if (flag) {
                print("ok")
            }else{
                print("error")
            }
        })
    }
    @IBAction func update(sender: AnyObject) {
        let sql = "UPDATE t_user SET name = '2222222'"
        self.queue?.inDatabase({ (database:FMDatabase!) -> Void in
            let flag = database.executeUpdate(sql, withArgumentsInArray: nil)
            if (flag) {
                print("ok")
            }else{
                print("error")
            }
        })
    }
    @IBAction func selectTest(sender: AnyObject) {
        let sql = "select * from t_user;"
        self.queue?.inDatabase({ (database:FMDatabase!) -> Void in
            let res:FMResultSet? = database.executeQuery(sql, withArgumentsInArray: nil)
            var arr:NSMutableArray = NSMutableArray()
            if res != nil
            {
                while(res!.next())
                {
                    let dic:NSDictionary = ["name":"\((res?.intForColumn("name"))!)","phone":(res?.stringForColumn("phone"))!,"id":(res?.stringForColumn("id"))!]
                    arr.addObject(dic)
                }
            }

            print(arr)
        })
    }
}

sqlite3的基本使用

使用之前先倒入sqlite3

//
//  ViewController.swift
//  数据库
//
//  Created by zhang on 16/3/13.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit
class ViewController: UIViewController {
    var db:COpaquePointer = COpaquePointer()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.openDataBase()
        // Do any additional setup after loading the view, typically from a nib.
    }
    func openDataBase()
    {
        // 拼接文件名
        let filePath = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!)database.sqlite"
        print(filePath)
        // 打开数据库
        if (sqlite3_open(filePath, &self.db) == SQLITE_OK) {
            print("打开成功");
        }else{
            print("打开失败");
        }
    }
    func execute(sql:String)->Bool
    {
        var flag:Bool
        if (sqlite3_exec(self.db, sql, nil, nil, nil) == SQLITE_OK) {
            flag = true;
        }else{
            flag = false;
        }
        return flag;
    }
    func query(sql:String)->[NSMutableArray]
    {
        // 1. 准备语句
        var stmt: COpaquePointer = nil
        /**
        1. 数据库句柄
        2. SQL 的 C 语言的字符串
        3. SQL 的 C 语言的字符串长度 strlen,-1 会自动计算
        4. stmt 的指针
        5. 通常传入 nil
        */
        var data:[NSMutableArray] = []
        if sqlite3_prepare_v2(self.db, sql, -1, &stmt, nil) == SQLITE_OK {
            // 单步获取SQL执行的结果 -> sqlite3_setup 对应一条记录
            while sqlite3_step(stmt) == SQLITE_ROW {
                // 获取每一条记录的数据
                data.append(recordData(stmt))
            }
        }
        return data
    }
    ///  获取每一条数据的记录
    ///
    ///  :param: stmt prepared_statement 对象
    func recordData(stmt: COpaquePointer)->NSMutableArray
    {
        // 获取到记录
        let array = NSMutableArray()
        let count = sqlite3_column_count(stmt)
        print("获取到记录,共有多少列 \(count)")
        // 遍历每一列的数据
        for i in 0..<count {
            let type = sqlite3_column_type(stmt, i)
            // 根据字段的类型,提取对应列的值
            switch type {
            case SQLITE_INTEGER:
                print("整数 \(sqlite3_column_int64(stmt, i))")
                array.addObject("\(sqlite3_column_int64(stmt, i))")
            case SQLITE_FLOAT:
                print("小树 \(sqlite3_column_double(stmt, i))")
                array.addObject(sqlite3_column_double(stmt, i))
            case SQLITE_NULL:
                print("空 \(NSNull())")
            case SQLITE_TEXT:
                let chars = UnsafePointer<CChar>(sqlite3_column_text(stmt, i))
                let str = String(CString: chars, encoding: NSUTF8StringEncoding)!
                array.addObject(str)
                print("字符串 \(str)")
            case let type:
                print("不支持的类型 \(type)")
            }
        }
        return array
    }
    @IBAction func createDataBase(sender: AnyObject) {

    }
    @IBAction func createTable(sender: AnyObject) {
        let sql = "create table if not exists t_user (id integer primary key autoincrement,name text,phone text);"
        if self.execute(sql)
        {
            print("执行成功")
        }
        else
        {
            print("执行成功")
        }
    }

    @IBAction func insert(sender: AnyObject) {
        let sql = "insert into t_user (name,phone) values ('\(rand())','\(rand())')"
        if self.execute(sql)
        {
            print("执行成功")
        }
        else
        {
            print("执行成功")
        }
    }
    @IBAction func deleteTest(sender: AnyObject) {
        let sql = "DELETE FROM t_user "
        if self.execute(sql)
        {
            print("执行成功")
        }
        else
        {
            print("执行成功")
        }
    }
    @IBAction func update(sender: AnyObject) {
        let sql = "UPDATE t_user SET name = '2222222'"
        if self.execute(sql)
        {
            print("执行成功")
        }
        else
        {
            print("执行成功")
        }
    }
    @IBAction func selectTest(sender: AnyObject) {
        let sql = "select * from t_user;"
        print(self.query(sql))
    }
}

VFL的使用

和http://jinblog.com/archives/520.html的文章两个例子完成的效果一样,注意格式

//
//  ViewController.swift
//  UIDynamic的使用
//
//  Created by admin on 16/2/29.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var viewA: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.constraintB()
    }
    func constraintB()
    {
        // 创建控件
        let viewA = UIView()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewA.backgroundColor = UIColor.blueColor()
        self.view.addSubview(viewA)
        let viewB = UIView()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        viewB.backgroundColor = UIColor.brownColor()
        self.view.addSubview(viewB)
        // 创建约束
        // 水平
        let viewAh = NSLayoutConstraint.constraintsWithVisualFormat("H:|-30-[viewA]-30-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA])
        // 垂直
        let viewAv = NSLayoutConstraint.constraintsWithVisualFormat("V:|-30-[viewA(50)]-[viewB(==viewA)]", options: NSLayoutFormatOptions.AlignAllRight, metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        // 比例值,需要用构造方法来完成
        let viewBwidth = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Width, multiplier: 0.5, constant: 0)
        // 添加约束
        self.view.addConstraint(viewBwidth)
        self.view.addConstraints(viewAh)
        self.view.addConstraints(viewAv)
//        let viewB
    }
    func constaintA()
    {
        // 创建控件
        let viewA = UIView()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewA.backgroundColor = UIColor.blueColor()
        self.view.addSubview(viewA)
        let viewB = UIView()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        viewB.backgroundColor = UIColor.brownColor()
        self.view.addSubview(viewB)

        // 创建约束
        // 水平方向,左右有间距,要加“|”,并把间距用“-”分隔
        let viewAh = NSLayoutConstraint.constraintsWithVisualFormat("H:|-30-[viewA]-[viewB(==viewA)]-30-|", options: NSLayoutFormatOptions.AlignAllBottom, metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        // 垂直方向,左边没有约束就不要加 “|”,直接固定数字,直接写数字,不要加等号
        let viewAv = NSLayoutConstraint.constraintsWithVisualFormat("V:[viewA(50)]-30-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA])
        self.view.addConstraints(viewAh)
        self.view.addConstraints(viewAv)
        // 没有对齐,传这个值就行
        let viewBv = NSLayoutConstraint.constraintsWithVisualFormat("V:[viewB(==viewA)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        self.view.addConstraints(viewBv)
    }
}

通过代码使用autolayout

//
//  ViewController.swift
//  autolayout-代码
//
//  Created by zhang on 16/2/29.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.constraintB()
    }
    func constraintB()
    {
        // 创建view
        let viewA = UIView()
        viewA.backgroundColor = UIColor.redColor()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        let viewB = UIView()
        viewB.backgroundColor = UIColor.grayColor()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(viewA)
        self.view.addSubview(viewB)

        let viewAleft = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1.0, constant: 30)
        let viewAright = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1.0, constant: -30)
        let viewAtop = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 30)
        let viewAheight = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 60)

        let viewBright = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Right, multiplier: 1.0, constant: 0)
        let viewBheight = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: 0)
        let viewBwidth = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Width, multiplier: 0.5, constant: 0)
        let viewBtop = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 30)
        self.view.addConstraints([viewBwidth,viewBheight,viewBright,viewBtop])
        self.view.addConstraints([viewAleft,viewAright,viewAtop,viewAheight])
    }
    func constraintA()
    {
        // 创建view
        let viewA = UIView()
        viewA.backgroundColor = UIColor.redColor()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        let viewB = UIView()
        viewB.backgroundColor = UIColor.grayColor()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(viewA)
        self.view.addSubview(viewB)
        // 创建约束
        // 左
        let viewAleft = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 30)
        // 下
        let viewAbottom = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: -30)
        // 宽度
        let viewAwidth = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: viewB, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)
        // 高度
        let viewAheight = NSLayoutConstraint(item: viewA, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 50)
        // 右
        let viewBright = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: -30)
        // 下
        let viewBbottom = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)
        // 高
        let viewBheight = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0)
        // 左
        let viewBleft = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 30)
        // 添加约束
        self.view.addConstraints([viewAleft,viewAbottom,viewAheight,viewAwidth])
        self.view.addConstraints([viewBbottom,viewBright,viewBheight,viewBleft])
    }
}