應用程序離不開數據的永久存儲,有兩種方式實現存儲:數據庫和文本文件。數據庫
做爲存儲管理器,最基本的功能就是增刪改查了。網絡
CoreDataapp
一、插入fetch
AppDelegate *app = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [app managedObjectContext]; NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"entityname" inManagedObjectContext:context]; [newManagedObject setValue:value forKey:@"propertyname"]; NSError *error; if (![context save:&error]) { // Handle the error… }
二、查詢ui
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Hero" inManagedObjectContext:managedObjectContext]; NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]initWithKey:@」name」 ascending:YES]; NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc]initWithKey:@」secretIdentity」 ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor1, sortDescriptor2, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; NSArray *objecs = [context executeFetchRequest: fetchRequest error:&error]; if(objets==nil || error != nil){
//作處理 }
三、修改spa
-(void)applicationWillResignActive:(NSNotification *)notification{ NSLog(@"applicationWillResignActive"); //建立託管對象上下文 NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context]; [request setEntity:entityDescription]; NSManagedObject *user = nil; NSError *error; NSArray *objets = [context executeFetchRequest:request error:&error]; if(objets==nil){ NSLog(@"There has a error!"); //作錯誤處理 } if([objets count]>0){ //非第一次,更新數據 NSLog(@"更新操做"); user = [objets objectAtIndex:0]; }else{ NSLog(@"插入操做"); //第一次保存,插入新數據 user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context]; } [user setValue:self.serverIp.text forKeyPath:@"serverIp"]; [user setValue:self.userName.text forKeyPath:@"userName"]; [context save:&error]; }
四、刪除線程
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; [context deleteObject:[objecs objectIndex:index]; NSError *error; if (![context save:&error]) { NSLog(@」Unresolved error %@, %@」, error, [error userInfo]); exit(-1); // Fail }
五、數據遷移code
當程序變化時,在不少簡單的狀況下,Coredata提供了輕量級的自動數據遷移,好比如下三個狀況能夠經過開啓CoreData自動遷移實現:
1.簡單的增長一個字段
2.把一個必填字段改成可選字段
3.把可選字段改成必填字段(但必定要定義默認值)orm
文本讀寫server
文本是存儲在外存上的字節序列,進程須要在內存中建立緩衝區(一般稱之爲「流」或「stream」,NSData和NSOutputStream的實例都對應「流」的概念),而後再進行讀寫,不過NSData通常配合NSArchiver一塊兒使用來存儲對象,對於文本讀寫、網絡傳輸,通常用NSOutputStream來做爲緩衝區,一個緩衝區對象封裝一些讀寫方法告訴線程如何進行讀寫。
在下面的例子中,進程調用inputData將學生數據插入對象關係數據庫,在調用queryStudents讀取學生信息,暫存在輸出流NSOutputStream的實例中,而後寫入CSV文本文件。
- (void)createFile:(NSString *)fileName; - (void)exportCSV:(NSString *)fileName; - (NSArray *)queryStudents; //控件關聯方法 - (IBAction)inputData:(id)sender { AppDelegate *app = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = app.managedObjectContext; Student *stu = (Student *)[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context]; stu.name = self.nameTextField.text; stu.num = self.numTextField.text; NSError *error = nil; [context save:&error]; self.nameTextField.text = @""; self.numTextField.text = @""; } - (IBAction)makeCSV:(id)sender { NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES); NSString *docementDir = [documents objectAtIndex:0]; NSString *filePath = [docementDir stringByAppendingPathComponent:@"student.csv"]; NSLog(@"filePath = %@", filePath); [self createFile:filePath]; [self exportCSV:filePath]; } //私有方法 - (void)createFile:(NSString *)fileName { NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager removeItemAtPath:fileName error:nil]; if (![fileManager createFileAtPath:fileName contents:nil attributes:nil]) { NSLog(@"不能建立文件"); } } - (void)exportCSV:(NSString *)fileName { NSOutputStream *output = [[NSOutputStream alloc] initToFileAtPath:fileName append:YES]; [output open]; if (![output hasSpaceAvailable]) { NSLog(@"沒有足夠可用空間"); } else { NSString *header = @"學好,姓名\n"; const uint8_t *headerString = (const uint8_t *)[header cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger headerLength = [header lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; NSInteger result = [output write:headerString maxLength:headerLength]; if (result <= 0) { NSLog(@"寫入錯誤"); } NSArray *students = [self queryStudents]; for (Student *stu in students) { NSString *row = [NSString stringWithFormat:@"%@,%@\n", stu.num, stu.name]; const uint8_t *rowString = (const uint8_t *)[row cStringUsingEncoding:NSUTF8StringEncoding]; NSInteger rowLength = [row lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; result = [output write:rowString maxLength:rowLength]; if (result <= 0) { NSLog(@"沒法寫入內容"); } } } [output close]; } - (NSArray *)queryStudents { NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; fetchRequest.entity = entity; NSArray *students = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; return students; }