为什么要这么做?
本地做的时候,直接在沙盒缓存.没有问题.当上传代码时,数据库文件不存在,别人使用时,从沙盒读取不到数据库中的数据,导致系统崩溃等问题
代码:(部分代码,此处为数据库的路径代码.这里路径随便写,写到沙盒中,创建数据库成功并添加完数据即可)
let path:String = NSHomeDirectory().stringByAppendingString("/Documents/Data.db")
print(path)
lock = NSLock()
dataBase = FMDatabase(path:path)
creatTable()
print(path)
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()
}
代码写到这时,多人合作,上传代码,他人使用时,数据库就不会出现问题.
代码的思路为:手动本地创建数据库,添加完数据后拖拽到工程中. 使用时,数据库路径为定义在沙盒路径中,如果没有数据库文件(第一次肯定没有),从工程中拷贝一份到沙盒中.
代码:
//是否更新数据库,这里设置为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!])
}
}
}
大体思路为: 定义标示符,判断是否是第一次创建数据库
如果是第一次创建数据库,则直接创建数据库,添加数据,存入沙盒.并且不执行定时更新的代码
如果不是第一次创建数据库,则执行更新代码.每次从沙盒中读取数据库内容