數據的持久性存儲(二)——CoreData(附Demo)


 CoreData是一款穩定、功能全面的持久性工具。(本文參考iphone開發3所寫,比較簡要,需詳細了解可以參考iphone開發3)

      首先創建一個新的項目CoraData,記得勾選Use Core Data:


        將CoraData 添加到已有的項目中有一定復雜性,因此蘋果公司為此選項提供了一些應用程序項目模板,以幫助你完成大部分工作。

        點擊Next,繼續完成新建工程。完成以后,打開項目的目錄:


        你會發現項目中有一個CoreDataTest.xcdatamodeld文件,這是我們的數據模型。CoreData允許可視的方式設計數據模型,而不需要編寫代碼。單擊該文件,你會看到數據模型編輯器:


       點擊左下方的Add Entity按鈕,添加實體:Line。然后在代碼中為這些實體創建托管對象

 

       術語“實體”和“托管對象”可能有點令人混淆,因為兩者都表示數據模型對象。術語“實體”表示對對象的描述,而“托管對象”用於在運行時創建的該實體的具體實例。因此,在數據模型編輯器中,你將創建實體,而在代碼中,你將創建並檢索托管對象。實體和托管對象的差異類似於類與類的實例之間的差異。

 

      然后點擊右側Attribute下方的“+”號,添加屬性LineNum,並將類型改為integer 16,添加屬性LineText,類型改為string。

      ok,數據模型創建完畢。

 

     然后把界面畫好吧,界面如下:


 

       從上圖可以看到有四個輸入框,一個保存按鈕。要做的就是輸入字段之后,點擊save,將字段保存起來。關閉程序,再次打開,讀取持久庫中的數據,並填入四個輸入框里。

      首先要做的是實現save按鈕的實現,實現代碼如下(附注釋):

 

[plain]  view plain copy
 
  1. -(void)save  
  2. {  
  3.      //獲取應用程序委托的引用,再用引用獲取創建好的托管對象上下文。  
  4.     MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];  
  5.     NSManagedObjectContext *context = [delegate managedObjectContext];  
  6.       
  7.     NSError *error;  
  8.     for (int i = 1; i <= 4; i++)  
  9.     {  
  10.         NSString *fieldName = [NSString stringWithFormat:@"line%d",i ];  
  11.         UITextField *theField = [self valueForKey:fieldName];  
  12.           
  13.         //創建提取請求  
  14.         NSFetchRequest *request = [[NSFetchRequest alloc] init];  
  15.           
  16.         //為已創建好的實體利用檢索到的上下文創建一個實體描述  
  17.         NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"  
  18.                                                              inManagedObjectContext:context];  
  19.         //創建好了以后發送給提取請求,以便請求能夠知道要查找的實體類型  
  20.         [request setEntity:entityDescription];  
  21.           
  22.         //確定持久庫中是否存在與此字段相對應的托管對象,所以穿件一個謂詞來確定字段的正確對象:  
  23.         NSPredicate *pred = [NSPredicate predicateWithFormat:@"lineNum == %d",i ];  
  24.         [request setPredicate:pred];  
  25.           
  26.         //由於我們還不知道是從持久庫中加載托管對象還是創建新的托管對象,  
  27.         //所以聲明一個指向NSManagedObject的指針並將他設置為nil  
  28.         NSManagedObject *theLine = nil;  
  29.           
  30.         //再次在上下文中執行提取請求  
  31.         NSArray *objects = [context executeFetchRequest:request error:&error];  
  32.           
  33.         if (objects == nil)  
  34.         {  
  35.             NSLog(@"There was an error!");  
  36.         }  
  37.           
  38.         //檢查示范返回了標准匹配的對象,若果有則加載它,如果沒有則創建一個新的托管對象來保存此字段的文本  
  39.         if ([objects count] > 0)  
  40.         {  
  41.             theLine = [objects objectAtIndex:0];  
  42.         }  
  43.         else  
  44.         {  
  45.             theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"  
  46.                                                     inManagedObjectContext:context];  
  47.         }  
  48.           
  49.         //使用鍵值編碼來設置行號以及托管對象的文本  
  50.         [theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"];  
  51.         [theLine setValue:theField.text forKey:@"lineText"];  
  52.           
  53.         [request release];  
  54.     }  
  55.     //完成循環之后要通知上下文保存其更改  
  56.     [context save:&error];  
  57. }  


        再看viewDidLoad方法,我們需要確定持久庫中是否已經存在數據,如果有則加載數據並使用它填充字段。實現與save方法差不多,實現如下(附注釋):

 

 

[plain]  view plain copy
 
  1. //獲取應用程序委托的引用,再用引用獲取創建好的托管對象上下文。  
  2. MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];  
  3. NSManagedObjectContext *context = [delegate managedObjectContext];  
  4.   
  5. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"  
  6.                                                      inManagedObjectContext:context];;  
  7. NSFetchRequest *request = [[NSFetchRequest alloc] init];  
  8. [request setEntity:entityDescription];  
  9.   
  10. //由於希望檢索持久庫中所有Line對象,因此沒有創建謂詞。通過執行沒有謂詞的請求,上下文將返回庫中的每一個Line對象  
  11.   
  12. NSError *error;  
  13.   
  14. NSArray *objects = [context executeFetchRequest:request error:&error];  
  15. //確保返回的是有效數組,如果不是則記錄它  
  16. if (objects == nil)  
  17. {  
  18.     NSLog(@"There was an error.");  
  19. }  
  20.   
  21. //然后使用快速枚舉遍歷已檢索托管對象的數組,從中提取LineNum和LineText值,並使用該信息更新用戶界面上的文本字段之一  
  22. for (NSManagedObject *oneObject in objects)  
  23. {  
  24.     NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];  
  25.     NSString *lineText = [oneObject valueForKey:@"lineText"];  
  26.       
  27.     NSString *fieldNmae = [NSString stringWithFormat:@"line%d",[lineNum intValue]];  
  28.     UITextField *theField = [self valueForKey:fieldNmae];  
  29.     theField.text = lineText;  
  30. }  
  31.   
  32. [request release];  


       這樣就簡單的實現了Coredata的存儲了。

 

       運行程序,輸入一些字段:


        關閉程序,再打開,可以看到字段還在,說明保存成功。

 

        程序demo鏈接:CoreDataTest Demo

轉http://blog.csdn.net/sjx19871225/article/details/8705213

NSPredicate文檔中文翻譯

http://blog.csdn.net/sjx19871225/article/details/8691720


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM