美文网首页
多看:数据库的应用+NSOperation

多看:数据库的应用+NSOperation

作者: 写啥呢 | 来源:发表于2016-09-23 17:54 被阅读0次

    数据库的应用

    class FMDBManager: NSObject {
        
        //MARK: - 属性
        //1.单例
        static let defaultManager = FMDBManager()
        private override init() {
            
        }
        
        
        //2.数据库
        lazy var db:FMDatabase = {
            //1.创建数据库对象
            //.db和.sqlite都是数据库文件的后缀
            let path = NSHomeDirectory()+"/Documents/user.db"
            let tdb = FMDatabase.init(path:path)
            
            //2.打开数据库
            let ret = tdb.open()
            //3.判断是否打开成功
            if ret{
            
                print("数据库打开成功")
            }else{
            
                print("数据库打开失败")
            }
            
            //创建表
            self.creatTable(tdb)
            
            return tdb
        }()
        
        
        //MARK: - 方法
        //1.创建表
        func creatTable(tdb:FMDatabase){
            //创建sql语句
            let sqlStr = "CREATE TABLE IF NOT EXISTS t_DataModel(keyId integer PRIMARY KEY AUTOINCREMENT,feed_title text NOT NULL,id text NOT NULL UNIQUE,img text,time_t text NOT NULL,title text NOT NULL);"
            //执行sql语句
            let ret = tdb.executeUpdate(sqlStr, withArgumentsInArray: [])
            //判断执行结果
            if ret {
                
                print("表创建成功")
            }else{
            
                print("表创建失败")
            }
            
        }
        
        
        //MARK: - 插入数据
        func inserData(model:DataModel){
            
            //创建sql语句
            let sqlStr = "INSERT INTO t_DataModel(feed_title,id,img,time_t,title) VALUES(?,?,?,?,?);"
            
            //执行结果
            var ret:Bool = false
            //执行sql语句
            if model.img == nil {
                
                ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [model.feed_title,model.id,"",model.time,model.title])
            }else{
            
                ret = self.db.executeUpdate(sqlStr, withArgumentsInArray: [model.feed_title,model.id,model.img!,model.time,model.title])
            }
            
            //判断执行结果
            if ret {
                print("数据插入成功")
            }else{
            
                print("数据插入失败")
            }
        }
        
        
        //MARK: - 获取指定的数据??
        func getData(size:Int) {
         
            //方案1:获取表中的所有的数据的个数,算出约束的第一个值
            //方案2:全部查询出来,逆序
        }
        
        //MARK: - 获取所有数据
        func getAllData() -> [DataModel] {
            
            var tempArray = [DataModel]()
            
            //创建数据查询的sql语句
            let sqlStr = "SELECT * FROM t_DataModel;"
            
            //执行sql语句
            let dataSet = self.db.executeQuery(sqlStr, withArgumentsInArray: [])
            
            //编辑结果集获取数据
            while dataSet.next() {
                
                //创建数据模型用来获取数据
                let model = DataModel.init()
                
                //获取数据
                model.feed_title = dataSet.objectForColumnName("feed_title") as! String
                model.id = dataSet.objectForColumnName("id") as! String
                model.img = dataSet.objectForColumnName("img") as? String
                model.time = dataSet.objectForColumnName("time_t") as! String
                model.title = dataSet.objectForColumnName("title") as! String
                
                //存储数据模型
                tempArray.append(model)
            }
            
            return tempArray
        }
        
        
    
    }
    
    
    class DataModel: NSObject {
        
        //属性
        var feed_title = ""
        var id = ""
        var img:String? = nil
        var time = ""
        var title = ""
        
        //方法
        init(dict:NSDictionary) {
            
            self.feed_title = dict["feed_title"] as!String
            self.id = dict["id"] as! String
            self.img = dict["img"] as? String
            self.time = dict["time"] as! String
            self.title = dict["title"] as! String
        }
        
        
        override init() {
            
        }
        
    
    }
    
    
    import UIKit
    import Alamofire
    import Kingfisher
    
    class ViewController: UITableViewController {
        //MARK: - 属性
        //1.数据源数组
        lazy var dataArray:[DataModel] = {
        
            return [DataModel]()
        }()
        //2.任务队列
        lazy var queue:NSOperationQueue = {
            let tqueue = NSOperationQueue.init()
            tqueue.maxConcurrentOperationCount = 3
            return tqueue
        }()
        //3.数据库管理
        let manager = FMDBManager.defaultManager
        
        //4.判断是否是第一获取到网络数据
        var isFirstNetData = true
        
        
    
        //MARK: - 方法
        override func viewDidLoad() {
            super.viewDidLoad()
            
            //1.判断当前的网络状态
            if self.hasNetWork() {
                //请求网络数据
                self.getNetData()
                self.dataArray = self.manager.getAllData()
                print("请求数据")
                
            }else{
                //去获取本地数据
                print("获取本地数据")
                self.dataArray = self.manager.getAllData()
                
            }
        }
    }
    
    //MARK: - tableView 协议方法
    extension ViewController{
    
        //1.设置cell的个数
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            
            return self.dataArray.count
        }
        
        //2.创建cell
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            
            //1.创建cell
            var cell = tableView.dequeueReusableCellWithIdentifier("cell")
            if cell == nil {
                
                cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
            }
            //2.刷新数据
            let model = self.dataArray[indexPath.row]
            //图片
            if model.img != nil {
                
                cell?.imageView?.kf_setImageWithURL(NSURL.init(string: model.img!)!, placeholderImage: nil)
            }else{
            
                cell?.imageView?.image = nil
            }
            //文字
            cell?.textLabel?.text = model.title
            cell?.detailTextLabel?.text = model.feed_title + "  " + model.time
            
            //3.返回cell
            return cell!
        }
        
        //3.设置cell的高度
        override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return 120
        }
        
    }
    
    //MARK: - 请求网络数据
    extension ViewController{
    
        func getNetData(){
            
           let urlStr = "http://0.0.0.0:tuicool@api.tuicool.com/api/articles/hot.json"
            //请求数据
            Alamofire.request(.GET, urlStr, parameters: ["pn":0,"size":15], encoding: .URL, headers: nil).responseJSON(options: .MutableContainers) { (data) in
                //判断数据是否为空
                if let json = data.result.value{
                    //拿到数组
                    let articleArray = json.objectForKey("articles") as! [NSDictionary]
                    
                    //在第一次网络请求成功后移除通过本地获取的本地数据
                    if self.isFirstNetData == true{
                    
                        self.dataArray.removeAll()
                        self.isFirstNetData = false
                    }
                    
                    //遍历数组拿到字典
                    for dict in articleArray{
                    
                        //根据字典创建数据模型
                        let model = DataModel.init(dict: dict)
                        
                        //将数据存放数据库中(在子线程中去执行)
                        self.queue.addOperationWithBlock({
                            self.manager.inserData(model)
                        })
                        
                        //将数据模型存到数组中
                        self.dataArray.append(model)
                    }
                    
                    //刷新界面
                    self.tableView.reloadData()
                    
                    
                }else{
                
                    print("没有请求到数据")
                }
                
                
            }
        }
        
    }
    
    //MARK: - 判断网络状态
    extension ViewController{
    
        func hasNetWork() -> Bool {
            
            //拿到当前的网络状态
            let status = Reachability.reachabilityForInternetConnection().currentReachabilityStatus()
            
            //判断网络状态是否是无网络连接
            if status == NotReachable{
                
                return false
            }
            
            return true
        }
        
    }
    
    

    定位

    import UIKit
    
    //获取位置信息的库
    import CoreLocation
    
    //注意:所有的iOS应用程序在获取手机位置信息前必须通过用户获得权限
    
    class ViewController: UIViewController {
        //MARK: - 属性
        //1.位置管理对象
        lazy var loactionManager:CLLocationManager = {
        
            return CLLocationManager()
        }()
        //2.地址解析器
        lazy var geocoder:CLGeocoder = {
        
            return CLGeocoder()
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            
            //获取定位权限
            self.getLoactionPermission()
            //设置定位管理者
            self.loactionSetting()
            //开始定位
            self.loactionManager.startUpdatingLocation()
        }
    
    
    }
    
    //MARK: - 设置定位属性
    extension ViewController{
    
        func loactionSetting() {
            
            //1.设置定位精度
            //kCLLocationAccuracyBest - 最高精度
            self.loactionManager.desiredAccuracy = kCLLocationAccuracyBest
            
            //2.设置刷新位置信息的最小距离,单位:米
            self.loactionManager.distanceFilter = 100
            
            //3.定位类型(设置定位用途)
            //AutomotiveNavigation -自动导航
            //Fitness -不行
            //OtherNavigation -其他交通工具导航
            self.loactionManager.activityType = .Other
            
            //4.设置代理(定位结果是通过协议方法获取的)
            self.loactionManager.delegate = self
        }
    }
    
    //MARK: - 协议方法
    extension ViewController:CLLocationManagerDelegate{
    
        //每次位置更新都会自动调用这个方法
        //参数2:获取到的位置信息
        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
        
            //1.拿到位置对象
            let loaction = locations.first
            
            //!!!a.经纬度
            let coord = loaction?.coordinate
            print("纬度:\(coord?.latitude),经度:\(coord?.longitude)")
            
            //b.海拔
            let altitude = loaction?.altitude
            print("海拔:\(altitude)")
            
            //c.楼层
            let floor = loaction?.floor
            print("楼层:\(floor)")
            
            //d.方向
            //范围是0-359.9  0->正北
            let course = loaction!.course
            print(course)
            
            //2.将定位得到的经纬度转换成具体的地址
            //参数1:位置
            //参数2:将位置转换成具体的地址后会执行闭包
            self.geocoder.reverseGeocodeLocation(loaction!) { (marks, error) in
                //参数1:转换结果对应的数组
                
                for mark in marks!{
                
                    //获取地址
                    let dict = mark.addressDictionary
                    print(dict)
                }
                
            }
            
            
        }
    }
    
    //MARK: - 获取位置权限
    extension ViewController{
    
        func getLoactionPermission() {
            //CLLocationManager:位置管理类
            //1.查看是否有定位服务
            let ret = CLLocationManager.locationServicesEnabled()
            if ret == true {
                
                //2.获取权限
                //a.设置info.plist文件
                //在info.plist中添加键值对: [NSLocationAlwaysUsageDescription:String]
                //b.请求权限
                self.loactionManager.requestAlwaysAuthorization()
                
            }else{
            
                print("没有定位服务")
            }
            
        }
    }
    
    

    相关文章

      网友评论

          本文标题:多看:数据库的应用+NSOperation

          本文链接:https://www.haomeiwen.com/subject/rrntyttx.html