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

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

方案一: (此处代码全部为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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值