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 plaincopy
-(void)save
{
//擷取應用程式委托的引用,再用引用擷取建立好的托管對象上下文。
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];
NSError *error;
for (int i = 1; i <= 4; i++)
{
NSString *fieldName = [NSString stringWithFormat:@"line%d",i ];
UITextField *theField = [self valueForKey:fieldName];
//建立提取請求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//為已建立好的實體利用檢索到的上下文建立一個實體描述
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
inManagedObjectContext:context];
//建立好了以後發送給提取請求,以便請求能夠知道要查找的實體類型
[request setEntity:entityDescription];
//确定持久庫中是否存在與此字段相對應的托管對象,是以穿件一個謂詞來确定字段的正确對象:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"lineNum == %d",i ];
[request setPredicate:pred];
//由于我們還不知道是從持久庫中加載托管對象還是建立新的托管對象,
//是以聲明一個指向NSManagedObject的指針并将他設定為nil
NSManagedObject *theLine = nil;
//再次在上下文中執行提取請求
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil)
{
NSLog(@"There was an error!");
}
//檢查示範傳回了标準比對的對象,若果有則加載它,如果沒有則建立一個新的托管對象來儲存此字段的文本
if ([objects count] > 0)
{
theLine = [objects objectAtIndex:0];
}
else
{
theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"
inManagedObjectContext:context];
}
//使用鍵值編碼來設定行号以及托管對象的文本
[theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"];
[theLine setValue:theField.text forKey:@"lineText"];
[request release];
}
//完成循環之後要通知上下文儲存其更改
[context save:&error];
}
再看viewDidLoad方法,我們需要确定持久庫中是否已經存在資料,如果有則加載資料并使用它填充字段。實作與save方法差不多,實作如下(附注釋):
[plain] view plaincopy
//擷取應用程式委托的引用,再用引用擷取建立好的托管對象上下文。
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
inManagedObjectContext:context];;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
//由于希望檢索持久庫中所有Line對象,是以沒有建立謂詞。通過執行沒有謂詞的請求,上下文将傳回庫中的每一個Line對象
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
//確定傳回的是有效數組,如果不是則記錄它
if (objects == nil)
{
NSLog(@"There was an error.");
}
//然後使用快速枚舉周遊已檢索托管對象的數組,從中提取LineNum和LineText值,并使用該資訊更新使用者界面上的文本字段之一
for (NSManagedObject *oneObject in objects)
{
NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
NSString *lineText = [oneObject valueForKey:@"lineText"];
NSString *fieldNmae = [NSString stringWithFormat:@"line%d",[lineNum intValue]];
UITextField *theField = [self valueForKey:fieldNmae];
theField.text = lineText;
}
[request release];
這樣就簡單的實作了Coredata的存儲了
運作程式,輸入一些字段:
關閉程式,再打開,可以看到字段還在,說明儲存成功。