Cocoa Touch(二):數據存儲CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults

應用程序離不開數據的永久存儲,有兩種方式實現存儲:數據庫和文本文件。數據庫

做爲存儲管理器,最基本的功能就是增刪改查了。網絡

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;
}
相關文章
相關標籤/搜索