iOS swift sqlite使用,上传及定时更新

来源:互联网 发布:linux服务器访问外网 编辑:程序博客网 时间:2024/06/11 15:36

为什么要这么做?
本地做的时候,直接在沙盒缓存.没有问题.当上传代码时,数据库文件不存在,别人使用时,从沙盒读取不到数据库中的数据,导致系统崩溃等问题

方案一: (此处代码全部为swift代码)

1. 先手动创建数据库并添加数据,

  代码:(部分代码,此处为数据库的路径代码.这里路径随便写,写到沙盒中,创建数据库成功并添加完数据即可)     let path:String = NSHomeDirectory().stringByAppendingString("/Documents/Data.db")    print(path)    lock = NSLock()    dataBase = FMDatabase(path:path)    creatTable()    print(path)

2.创建好后拖拽到工程中

3.修改本地代码(把之前的数据库路径(即第一步代码)删除,修改为本步骤的代码):

   1) 数据库路径: 首先定义到沙盒中,在Document中新建文件夹(xxx),创建数据库文件(xxx.db)   2)这时,路径肯定不存在.从工程中把数据库文件复制到新建的文件夹中代码: func openDB(){ let fileManager = NSFileManager.defaultManager()  var isFile = false;  //从这里开始判断有没有数据库文件  let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first;  let path = documentDirectory?.stringByAppendingString("/ZhuLuoXi")  //文件夹的沙盒路径  let isDirExist = fileManager.fileExistsAtPath(path!)  //如果文件夹没有,则创建文件夹  if !isDirExist{      do {          try fileManager.createDirectoryAtPath(path!, withIntermediateDirectories: true, attributes: nil)      } catch let error as NSError {            print("Error: \(error.domain)")      }  }  //数据库文件路径  let dbFilePath = path?.stringByAppendingString("/ZhuLuoXi.db")  //判断数据库路径存不存在,如果存在,通过路径创建dataBase(第一次使用路径肯定不存在,则执行下面代码,从工程中拷贝一份数据库文件到沙盒中,确保路径存在)  if fileManager.fileExistsAtPath(dbFilePath!) {        isFile = true  }  //如果数据库路径不存在,从工程中拷贝一份数据库文件到沙盒中,路径就会存在  if isFile == false{    let dbPath = NSBundle.mainBundle().pathForResource("ZhuLuoXi", ofType: "db");      do{          try fileManager.copyItemAtPath(dbPath!, toPath: dbFilePath!)      }catch let error as NSError{            print("Error: \(error.domain)")      }  }  //通过路径初始化dataBase  self.dataBase = FMDatabase(path: dbFilePath)  print("数据库路径--------------------\(dbFilePath)")  self.creatTable()}

代码写到这时,多人合作,上传代码,他人使用时,数据库就不会出现问题.
代码的思路为:手动本地创建数据库,添加完数据后拖拽到工程中. 使用时,数据库路径为定义在沙盒路径中,如果没有数据库文件(第一次肯定没有),从工程中拷贝一份到沙盒中.

4.定时更新数据库: 数据库中的文件如果会发生变化,则需要定期更新

代码:    //是否更新数据库,这里设置为30天更新一次func isUpdateDBManager()->Bool{    var isUpdate = false    let date = NSDate()    let updateTime = NSUserDefaults.standardUserDefaults().valueForKey("_updateDBManager") as? Double    if updateTime < 1000.0 || (updateTime! + 30 * 24 * 60 * 60) < (date.timeIntervalSince1970){        isUpdate = true    }    return isUpdate}//更新数据(这里为更新两张表),     //有个缺陷是表的自增id不会从1开始排序func updataDB(){    if isUpdateDBManager() == false{        return    }         //插入区县数据    deleteList("delete from countyTable")  //插入之前先删除    CountyModel.loadCountyList { (countyModels) -> () in        for county in countyModels!{            print(countyModels?.count)            let sql = "insert into countyTable(county_id,name,code,city_id,post_code,lng,lat) values (?,?,?,?,?,?,?)"            self.insert(sql, param:[county.county_id!,county.name!,county.code!,county.city_id!,county.post_code!,county.lng!,county.lat!])        }    }    //        插入市数据    deleteList("delete from cityTable")  //插入之前先删除    CityModel.loadCityList { (cityModels) -> () in        for city in cityModels!{            let sql = "insert into cityTable(city_id,name,province_id,code,lng,lat) values (?, ?,?,?,?,?)"            self.insert(sql, param: [city.city_id!,city.name!,city.province_id!,city.code!,city.lng!,city.lat!])        }    }}

方案二:

  大体思路为:  定义标示符,判断是否是第一次创建数据库  如果是第一次创建数据库,则直接创建数据库,添加数据,存入沙盒.并且不执行定时更新的代码  如果不是第一次创建数据库,则执行更新代码.每次从沙盒中读取数据库内容
0 0
原创粉丝点击