說到數據的保存,我們先來了解下數據存儲的地址,沙箱模型的有四個文件夾,分別是:
Document
,AppName.app
,Library
,tmp
。
Documents 目錄
:您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用于存儲用戶數據或其它應該定期備份的信息。AppName.app 目錄
:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。Library 目錄
:包括Caches
和PreferencesPreferences
PreferencesPreferences
:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults
類來取得和設置應用程序的偏好。
Caches
:用于存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。-
tmp 目錄
:這個目錄用于存放臨時文件,保存應用程序再次啟動過程中不需要的信息。// Document 路徑 let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask, true) let documnetPath = documentPaths[0] as! String // Library 路徑 let libraryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory,NSSearchPathDomainMask.UserDomainMask, true) let libraryPath = libraryPaths[0] as! String // Cache 路徑 let cachePaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory,NSSearchPathDomainMask.UserDomainMask, true) let cachePath = cachePaths[0] as! String // tmp 路徑 let tmpDir = NSTemporaryDirectory()
一、 NSUserDefaults
一般來說,我們用來保存的偏好設置都是用 NSUserDefaults中,快速簡單。
//1、 保存
NSUserDefaults .standardUserDefaults().setObject("weNeedSaveValue", forKey: "My_Key")
NSUserDefaults .standardUserDefaults().setBool(false, forKey: "My_IsOK")
//2、同步
NSUserDefaults .standardUserDefaults() .synchronize()
//3、取值
NSUserDefaults.standardUserDefaults() .objectForKey("My_Key")
二、NSKeyedArchiver 歸檔
歸檔(又名序列化),把對象轉為字節碼,以文件的形式存儲到磁盤上;程序運行過程中或者當再次重寫打開程序的時候,可以通過解歸檔(反序列化)還原這些對象。
首先了解下它所存在的位置上:
var path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
var filePath = path.stringByAppendingPathComponent("data.archive")
先自定義一個數據模型
class MyArchiveModel: NSObject,NSCoding {
var name: String!
var phone: String!
var age: NSInteger!
func encodeWithCoder(aCoder: NSCoder){
aCoder.encodeObject(self.name, forKey: "name")
aCoder.encodeObject(self.phone, forKey: "phone")
aCoder.encodeObject(self.age, forKey: "age")
}
required init(coder aDecoder: NSCoder) {
super.init()
self.name = aDecoder.decodeObjectForKey("name") as! String
self.phone = aDecoder.decodeObjectForKey("phone") as! String
self.age = aDecoder.decodeObjectForKey("age") as! NSInteger
}
override init() {
}
}
序列化
//創建一個全局路徑,即要保存的位置:
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
let filePath = path.stringByAppendingPathComponent("my_Archiver")
let myArchive : MyArchiveModel = MyArchiveModel()
myArchive.name = "Yang"
myArchive.phone = "888888"
myArchive.age = 24
//歸檔
print("\("save")")
NSKeyedArchiver .archiveRootObject(myArchive, toFile: filePath)
反序列化
// 之前保存的位置
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
let filePath = path.stringByAppendingPathComponent("my_Archiver")
let unArchive = NSKeyedUnarchiver .unarchiveObjectWithFile(filePath) as! MyArchiveModel
print("unArchiver===\(unArchive.name,unArchive.phone,unArchive.age)")
// print :unArchiver===("Yang", "888888", 24)
相對 NSUserDefaults 來說,速度慢些,但是可以保存自定義類型的
三、CoreData
Core Date是ios3.0后引入的數據持久化解決方案,它是是蘋果官方推薦使用的,不需要借助第三方框架。Core Date實際上是對SQLite的封裝,提供了更高級的持久化方式。在對數據庫操作時,不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作數據庫中的數據。
簡單點說,Core Data實際上是將數據庫的創建、表的創建、對象和表的轉換等操作封裝起來,極大的簡化了我們的操作。
下面簡單的運用下:
3-1、建立項目,勾選上coreData
項目創建成功后,會在AppDelegate類中自動添加相關代碼,此外,還會自動生成一個數據模型文件JRCoreData.xcdatamodeld
3-2、添加實體
3-3、生成同名的類
3-4、代碼中的實現
先導入
import CoreData
然后分別從 保存、獲取、刪除、修改
override func viewDidLoad() {
super.viewDidLoad()
self .insertTheData()
// 3秒之后獲取
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
self .findTheData()
}
// Do any additional setup after loading the view, typically from a nib.
}
func insertTheData()
{
// 獲取管理數據的上下文 對象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
let user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as! User
user.name = "Yang"
user.password = "123456"
user.id = "01"
do {
try context .save()
}
catch{
print("\("save failed")")
}
}
func findTheData()
{
//獲取管理的數據上下文 對象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
//聲明數據的請求
let fetchRequest:NSFetchRequest = NSFetchRequest()
fetchRequest.fetchLimit = 10 //限定查詢結果的數量
fetchRequest.fetchOffset = 0 //查詢的偏移量
//聲明一個實體結構
let entity:NSEntityDescription? = NSEntityDescription.entityForName("User",
inManagedObjectContext: context)
//設置數據請求的實體結構
fetchRequest.entity = entity
//設置查詢條件
let predicate = NSPredicate(format: "id= '01'", "")
fetchRequest.predicate = predicate
//查詢操作
var fetchedObjects :[AnyObject]?
do{
fetchedObjects = try context .executeFetchRequest(fetchRequest)
}
catch{
print("\("have problem")")
}
//遍歷查詢的結果
for info:User in fetchedObjects as! [User]
{
print("id=\(info.id)")
print("username=\(info.name)")
print("password=\(info.password)")
}
//遍歷查詢的結果
for info:User in fetchedObjects as! [User]{
//修改密碼
info.password = "002221"
//重新保存
do{
try context.save()
}
catch{
print("save Failed")
}
}
for info:User in fetchedObjects as! [User]{
//刪除對象
context.deleteObject(info)
}
}
當然,要熟練掌握和更加理解CoreData,多使用幾次才行。
陸續添加中····
備注:
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreData_ObjC/index.html#//apple_ref/doc/uid/TP40001181
http://www.cnblogs.com/iCocos/p/4672168.html