Swift 數據存儲

說到數據的保存,我們先來了解下數據存儲的地址,沙箱模型的有四個文件夾,分別是:Document,AppName.app, Library,tmp

  1. Documents 目錄:您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用于存儲用戶數據或其它應該定期備份的信息。

  2. AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。

  3. Library 目錄:包括CachesPreferencesPreferences
    PreferencesPreferences:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好。
    Caches:用于存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。

  4. 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

建立項目,勾選上coreData

3-2、添加實體

建立實體

3-3、生成同名的類

添加類
勾選1
勾選2
效果

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容