数据库的应用
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("没有定位服务")
}
}
}