fb_license

技術標籤

@selector (1) 初使化區塊 (1) 物件 (1) 物件導向 (2) 型別 (4) 封裝 (1) 流程控制 (1) 陣列 (3) 推論型別 (2) 實機測試 (1) 蓋索林(gasolin) (1) 模組 (1) 憑證 (1) 轉型 (1) 羅康鴻 (121) 類別 (1) 變數 (5) Accelerometer (1) ActiveRecord (1) Activity (1) AFNetworking (1) alloc (1) Android (3) Animation (1) App (1) App ID (1) APP上傳 (1) ASP.NET (1) AVAudioPlayer (1) block (1) C# (2) class (1) CLLocationManager (1) CLLocationManagerDelegate (1) CMMotionManager (4) Controller (1) delegate (1) DELETE語法 (1) Device Motion資料 (1) Dialog (1) DropDownList (1) dynamic language (2) Facebook SDK (9) FBRequest (5) FBRequestConnection (2) FMDB (1) Gesture Recognizers (6) GROUP BY (2) Gyro (1) HAVING (1) IBAction (1) IBOutlet (1) id (3) inheritance (1) init (1) Insert (1) instance variable (1) Interface Builder (1) iOS (70) iOS idea (7) iOS Introduction (1) Layout (1) Magnetometer (1) Menu (2) Method (2) MKMapView (1) MKPointAnnotation (1) MS SQL (5) Nil (1) NSArray (1) NSDictionary (1) NSError (1) NSFileManager & .plist (1) NSMutableArray (1) NSMutableDictionary (1) NSNotificationCenter (1) NULL (1) object (2) Objective-C (16) Objective-C idea (1) ORDER BY (1) Parameter (1) property (1) protocol (2) Provisioning (1) Proximate Sensor (1) Q and A (2) R類別 (1) Rails (9) RESTful SOA (9) Ruby (8) Scene (1) SEELECT (1) Segue (2) SEL (1) SELECT語法 (1) Shake (1) Simulator (1) SOA (8) SQL (6) SQL Server (5) SQL函數 (1) SQL彙總函數 SQL (1) SQLite (1) Storyboard (1) Style (1) Swift (1) Table (1) target & action (1) Theme (1) Toast (1) TRUNCATE TABLE語法 (1) UIActionSheet (1) UIActionSheetDelegate (1) UIActivityIndicatorView (1) UIAlertView (1) UIBarButtonItem (1) UIButton (1) UICollectionView (1) UICollectionViewDataSource (1) UIControl (9) UIDatePicker (1) UIImage (1) UIImagePickerController (2) UIImagePickerControllerDelegate (2) UIImageView (1) UILabel (1) UILongPressGestureRecognizer (1) UINavigationController (2) UIPanGestureRecognizer (1) UIPinchGestureRecognizer (1) UIProgressView (1) UIResponder (1) UIRotationGestureRecognizer (1) UISegmentedControl (1) UISlider (1) UIStepper (1) UISwipeGestureRecognizer (1) UISwitch (1) UITabBarController (1) UITableView (1) UITableViewDataSource (1) UITapGestureRecognizer (1) UITextField (1) UITextFieldDelegate (1) UITextView (2) UITextViewDelegate (1) UIToolBar (1) UIView (8) UIWebView (1) UPDATE語法 (1) var (2) VB.NET (7) View (4) WHERE子句 (1) XML (1)

2014/04/07

[iOS] NSFileManager & .plist


我是NSFileManager,我可以,建立與管理檔案於資料匣中。

我是.plist,我可以將資料以XML檔案格式的方式保存

我是NSDictionary,我可以寫入資料至.plist檔


那我們合作吧,NSDictionary寫入資料至.plist檔,在透過NSFileManager將檔案存於特定資料匣中。









第1步:建立一個名為"NSFileManager_plist_NSDictionary"的"Single View Application"專案。



第2步:新增TempData.plist樣板檔案
  • 新增TempData.plist檔,後續會使用此檔作為新檔案的樣板,作為樣板的目的是.plist是一個XML檔,其會有特定的儲存格式,透過新增.plist檔的方式,即可在自動完成此格式的設定,之後直複製使用就可以了



第3步:設定畫面
  • 分別建立"寫入"與"讀取"2個按鈕
  • 並建立對應的Touch Up Inside事件對應的IBAction

第4步:複製建立.plist

  • 於ViewController.m檔中,建立createPlist方法,此方法會回傳plist的檔案路徑
  • 透過NSFileManger建立"data.plist"檔,而建立的方式是透過複製"tempData.plist"的方式建立
  • 當然,透過NSFileManger可先透過fileExistAtPath訊息判斷要建立的檔案是否已存在,若不存在才建立
ViewController.m
//建立複製一個data.plist檔 -(NSString*)createPlist { NSError *error; //搜尋此APP下的Document目錄, //記住,Document是可讓使用者自行建檔的其中一個目錄 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //第0個index,即為Document目錄的字串 NSString *documentsDirectory = [paths objectAtIndex:0]; //在Document下加上檔名data.plist NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.plist"]; //defaultManager訊息, //取得預設的NSFileManager NSFileManager *fileManager = [NSFileManager defaultManager]; //透過NSFileManager, //查看data.plist檔是否存在, //若不存在,則複製新的plist檔 if (![fileManager fileExistsAtPath: path]) { //取得bundle下的tempData.plist檔案路徑, //記住,bundle指的是APP這整包程式, //整理APP即打包成一個bundle, //內容是固定的。 NSString *bundle = [[NSBundle mainBundle] pathForResource:@"tempData" ofType:@"plist"]; //複製tempData.plist成document目錄下的data.plist [fileManager copyItemAtPath:bundle toPath: path error:&error]; } //回傳document目錄下的data.plist路徑 return path; }

第5步:資料寫入.plist

  • 於ViewController.m檔中的write:方法中,加入寫入plist的程式
  • 方法很簡單,透過NSDictionary的writeToFile:automatically:訊息,即可將資料寫入plist檔中
ViewController.m
- (IBAction)write:(id)sender { //建立NSDictionary資料 NSDictionary *data = [[NSDictionary alloc]initWithObjectsAndKeys: @"Nick", @"name" , @"19", @"age" , nil]; //取得document目錄下的data.plist路徑 NSString *path = [self createPlist]; //寫入資料至data.plist, //automically為YES, //表示會自動作好檔案寫入管理, //避免直接寫檔寫壞了的風險 [data writeToFile: path atomically:YES]; }

第6步:資料讀自.plist


  • 於ViewController.m檔中的read:方法中,加入讀取plist的程式
  • 在建立NSDictionary時,透過initWithContentsOfFile:即可將plist的資料讀出至NSDictionary
  • 在最後以AlertView顯示讀取到的資料
ViewController.m
- (IBAction)read:(id)sender { //取得document目錄下的data.plist路徑 NSString *path = [self createPlist]; //透過initWitiContentsOfFile, //將資料自data.plist中讀出至NSDictionary NSDictionary *data = [[NSDictionary alloc] initWithContentsOfFile:path]; //組合data中的資料成一段文字 NSString * msg = [NSString stringWithFormat:@"name:%@, age:%@" , [data objectForKey:@"name"] , [data objectForKey:@"age"]]; //透過UIAlertView顯示讀取的資料 UIAlertView * alert = [[UIAlertView alloc] initWithTitle:Nil message:msg delegate:nil cancelButtonTitle:@"關閉" otherButtonTitles:nil]; [alert show]; }


第7步:執行
  • 若先按讀取,則會無任何資料
  • 先儲存在讀取,你會發現AlertView會顯示出存入後讀取的資料





檔案連結:NSFileManager_plist_NSDictionary.zip


更多的NSFileManager資訊:
  • 在iOS中,檔案的儲存目錄可分為下列四類:
    • Documents
      • 這是最常被用來存放檔案的資料夾,也是 Apple 官方建議存放檔案的資料夾,iTunes 備份時會連同此資料夾做備份。
    • Library
      • 預設是用來存放程式的相關資訊,像是設定或是執行狀態等等。
    • Tmp
      • 暫存用的資料夾,當應用程式結束時,此資料夾也會一並銷燬,不會備份,當系統需要而外資源時,也會優先刪除該資料夾內的東西。
    • Cache
      • 位於 Library 中,是 Library 內的子資料夾,此資料夾並不會被 iTunes 備份。
  • NSFile除了可以複製檔案外、也可以搬移、建立、刪除檔案,同時也可以與NSData搭配,直接將資料寫入檔案中,透過NSData的搭配,你可以自訂自已的資料格式
更多的資料請參考: